ホームページ  >  記事  >  Java  >  Java ジェネリックスの「super」キーワードがワイルドカードに制限されており、型パラメーターには制限されていないのはなぜですか?

Java ジェネリックスの「super」キーワードがワイルドカードに制限されており、型パラメーターには制限されていないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 07:20:02687ブラウズ

Why is the `super` keyword restricted to wildcards and not type parameters in Java generics?

「super」キーワードによるジェネリックの境界

なぜ super キーワードは Java ジェネリックの型パラメータではなくワイルドカードにのみ適用されるのか不思議に思う人もいるかもしれません。 Collection インターフェイスの次の例を考えてみましょう。ここでは、toArray メソッドが次のように宣言されていません:

interface Collection<T> {
    <S super T> S[] toArray(S[] a);
}

この構文は不正な宣言につながります。その理由を理解するには、named で super を使用することの影響を調べる必要があります。型パラメータ。

型パラメータの 'super' の制限

名前付き型パラメータ () を制限するために super を使用しても、意図した効果。 Object はすべての参照型の最終的なスーパークラスであるため、参照型の配列は Object[] にキャストできます。これは、仮定の構文を使用しても、次のコードはコンパイルされ、実行時に ArrayStoreException が発生することを意味します:

List<Integer> integerList;
integerList.toArray(new String[0]);  // should be disallowed, but compiles

したがって、名前付き型パラメータでは super を使用できません。

ジェネリックと配列: 複雑な関係

考慮すべきもう 1 つの側面は、ジェネリックと配列の間の複雑な相互作用です。 Java では、配列は他のコレクション型とは異なる方法で扱われるため、型安全性の強制に制限が生じます。これは、指定された例でジェネリック型の境界が ArrayStoreException を防ぐことができない理由を説明しています。

'super' を使用した不正な境界の例

この問題をさらに詳しく説明するために、仮説的な方法を考えてみましょう。宣言:

<T super Integer> void add(T number)  // hypothetical! currently illegal

この構文では、Integer インスタンスと Number インスタンスは受け入れられるが、String インスタンスは受け入れられないと思われるかもしれません。ただし、String は Object のサブクラスであり、Object は Integer のスーパークラスであるため、add(aString) がコンパイルされる可能性があり、潜在的なエラーが発生します。

結論

結論として、型の安全性を確保し、無効な仮定を防ぐために、名前付き型パラメーターでの super の使用は制限されています。 Java のジェネリックと配列には、スーパーを使用して型パラメーターを境界付ける効果を制限する独自の特性があります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。