反変の 'Super' キーワードによるジェネリックスの境界
Java ジェネリックスでは、'super' キーワードはサブタイプを確立する際に重要な役割を果たします。型パラメータ。ただし、ワイルドカードでのみ使用でき、名前付き型パラメータでは使用できません。これは一般的な質問です: なぜですか?
なぜ型パラメーターでは使用できないのですか?
型パラメーターで 'super' を使用できない理由は、そのような制約が次のようなものになるためです。予期せぬ動作を防ぐのには効果がありません。すべての参照型の究極のスーパークラスであるオブジェクトでは、仮想的な「スーパー」バインドは実際には無意味になります。
たとえば、Collection インターフェイスの次の仮想的なメソッドを考えてみましょう。
<code class="java"><S super T> S[] toArray(S[] a);</code>
このようなメソッドを宣言しようとすると、コンパイル時に失敗します。たとえそれが許可されたとしても、本来の目的は達成されません。すべての参照型配列はオブジェクト配列であるため、任意の配列型を引数として使用でき、「スーパー」バインドが無効になります。
配列の結果
ジェネリックと配列には複雑な関係があり、名前付き型パラメーターに「スーパー」境界がないことがこれを反映しています。パラメーター配列をパラメーター化された型のスーパークラスを持つ配列のみに制限することが望ましいように思えるかもしれませんが、配列ではそれは不可能です。
たとえば、'List
結論
結局のところ、Java ジェネリックスの名前付き型パラメーターから 'super' キーワードが除外されるのは、ジェネリックスのコンテキストにおける配列の固有の制限によるものです。このような制限を禁止することで、Java は開発者が、最終的に望ましい安全性の保証を提供できなくなる可能性のある誤解を招く可能性のある制約を作成することを防ぎます。
以上がJava ジェネリックスの名前付き型パラメータで「Super」キーワードを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。