Java ジェネリックスの型パラメータのバインドに「super」キーワードを使用できないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-01 09:21:02
オリジナル
937 人が閲覧しました

Why can't the 'super' keyword be used to bound type parameters in Java generics?

'super' キーワードによるジェネリックの境界: 詳細な説明

質問: なぜ 'super' キーワードを使用できないのですかワイルドカードとは異なり、型パラメータの境界を設定しますか?

答え:

型パラメータを 'super' (例: '') で境界付けることは許可されていません。 Java を使用するのは、型バインドに対する効果が事実上無視でき、本来の目的を果たさないからです。

次の仮想コードを考えてみましょう:

interface Collection<T> {
    <S super T> S[] toArray(S[] a);
}
ログイン後にコピー

このコードは、'toArray' メソッドを提案しています。 「Collection」インターフェイスには、「T」のスーパータイプである型パラメータ「S」が必要です。ただし、すべての型が 'Object' のスーパータイプであり、任意の参照型の配列を 'Object[]' にキャストできるため、コンパイラーは任意の配列を引数として渡すことを許可するため、この境界は無意味になります。

したがって、型パラメーターのバインドに 'super' を使用しても、'ArrayStoreException' などの実行時エラーは防止されません。そのため、Java の型システムでは許可されていません。

例:

仮説的なジェネリック メソッドを考えてみましょう:

<T super Integer> void add(T number)
ログイン後にコピー

このメソッドの目的は次のとおりです。 「整数」、「数値」、および「オブジェクト」 (これらはすべて「整数」のスーパークラスであるため) の追加は許可されますが、「文字列」は追加できないため許可されません。ただし、「Object」は「Integer」のスーパークラスであるため、暗黙的なキャストにより「文字列」が追加される可能性があり、実行時エラーが発生する可能性があります。

追加の考慮事項:

  • ジェネリックと配列: ジェネリックと配列には固有の制限があり、シームレスに混在しません。
  • 'super' を使用する代替手段:このようなシナリオで型安全性を実現するには、型パラメーターを「super」で制限する代わりに、ワイルドカードまたはメソッドのオーバーロードを使用することをお勧めします。

関連リソース:

  • Java チュートリアル/ジェネリック

    • サブタイプ
    • ワイルドカードを使ってさらに楽しく
  • Java ジェネリック: PECS とは何ですか? (プロデューサーはコンシューマー スーパーを拡張します)
  • Java ジェネリックにおけるスーパーと拡張の違いは何ですか

以上がJava ジェネリックスの型パラメータのバインドに「super」キーワードを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート