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

Linda Hamilton
リリース: 2024-10-31 16:22:30
オリジナル
262 人が閲覧しました

Why Can't We Use 'super' Keyword for Type Parameter Bounds in Java Generics?

「スーパー」キーワードを使用した境界ジェネリックス: 包括的な説明

Java ジェネリックスにより、型安全性とコードの再利用性が可能になります。ジェネリックスの 1 つの側面は型境界であり、型パラメーターを特定のサブタイプ関係に制限できます。ただし、ワイルドカードとは異なり、'super' キーワードを使用して型パラメータを制限することはできません。

Collection インターフェイスでは、toArray メソッドは型パラメータである 'S[]' の引数を受け取ります。なぜメソッドが「」として宣言されないのかという疑問が生じます。

その答えは、「スーパー」境界の動作にあります。 「super」は通常、ワイルドカード (<'? super T'>) とともに使用されますが、これを型パラメータに適用すると (> の代わりに <'')、意図しない結果。 Object はすべての参照型のスーパークラスです。つまり、'Object[]' は '<'S super T>>' に対する有効な引数です。コンパイル時に。これは、'T' のサブクラスでないものであっても、任意の参照型引数が渡される可能性があるため、バインドの目的を無効にします。

したがって、型パラメーターの 'スーパー' 境界は、型パラメーターに対する期待される保護を提供しません。無効な引数。説明すると、仮説的なメソッド「」は次のようになります。 S[] toArray(S[] a)' と '' as 'Integer' は、'String' が 'Integer' のスーパークラスではないにもかかわらず、'String[]' 型の引数を許可します。 「String[]」は「Object[]」であるため、「スーパー」境界を満たします。

この制限は、ジェネリックと配列の間の相互作用に起因します。ジェネリックと配列には異なる共分散ルールがあり、観察される動作につながります。

この制限は型パラメーターにのみ適用されることに注意することが重要です。ワイルドカードは、「<」で見られるように、差異を表現するために「super」を使用してバインドすることができます。スーパーT>'

ジェネリックと型境界の詳細については、次のリソースを参照してください。

  • Java チュートリアル/ジェネリック
  • Java ジェネリック: PECS とは何ですか?
  • Java ジェネリックの super と extends の違いは何ですか

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

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