質問: なぜ '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」のスーパークラスであるため、暗黙的なキャストにより「文字列」が追加される可能性があり、実行時エラーが発生する可能性があります。
追加の考慮事項:
関連リソース:
Java チュートリアル/ジェネリック
以上がJava ジェネリックスの型パラメータのバインドに「super」キーワードを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。