ホームページ  >  記事  >  Java  >  Java ジェネリックスの名前付き型パラメータで「Super」キーワードを使用できないのはなぜですか?

Java ジェネリックスの名前付き型パラメータで「Super」キーワードを使用できないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 10:01:29718ブラウズ

Why Can't We Use the 'Super' Keyword with Named Type Parameters in Java Generics?

反変の 'Super' キーワードによるジェネリックスの境界

Java ジェネリックスでは、'super' キーワードはサブタイプを確立する際に重要な役割を果たします。型パラメータ。ただし、ワイルドカードでのみ使用でき、名前付き型パラメータでは使用できません。これは一般的な質問です: なぜですか?

なぜ型パラメーターでは使用できないのですか?

型パラメーターで 'super' を使用できない理由は、そのような制約が次のようなものになるためです。予期せぬ動作を防ぐのには効果がありません。すべての参照型の究極のスーパークラスであるオブジェクトでは、仮想的な「スーパー」バインドは実際には無意味になります。

たとえば、Collection インターフェイスの次の仮想的なメソッドを考えてみましょう。

<code class="java"><S super T> S[] toArray(S[] a);</code>

このようなメソッドを宣言しようとすると、コンパイル時に失敗します。たとえそれが許可されたとしても、本来の目的は達成されません。すべての参照型配列はオブジェクト配列であるため、任意の配列型を引数として使用でき、「スーパー」バインドが無効になります。

配列の結果

ジェネリックと配列には複雑な関係があり、名前付き型パラメーターに「スーパー」境界がないことがこれを反映しています。パラメーター配列をパラメーター化された型のスーパークラスを持つ配列のみに制限することが望ましいように思えるかもしれませんが、配列ではそれは不可能です。

たとえば、'List' などです。理論的には、「toArray」の引数として Integer[]、Number[]、または Object[] のみを受け入れる必要があります。ただし、配列の共分散により、すべての参照型配列もオブジェクト配列になります。その結果、「Integer[]」のサブクラスではない「String[]」が「toArray」に渡される可能性があり、実行時に「ArrayStoreException」が発生する可能性があります。

結論

結局のところ、Java ジェネリックスの名前付き型パラメーターから 'super' キーワードが除外されるのは、ジェネリックスのコンテキストにおける配列の固有の制限によるものです。このような制限を禁止することで、Java は開発者が、最終的に望ましい安全性の保証を提供できなくなる可能性のある誤解を招く可能性のある制約を作成することを防ぎます。

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

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