Java でジェネリック メソッドで生の型を使用すると型エラーが発生するのはなぜですか?

Patricia Arquette
リリース: 2024-11-12 00:10:03
オリジナル
621 人が閲覧しました

Why does using raw types with generic methods lead to type errors in Java?

生の型とジェネリック メソッドの組み合わせ

Java でジェネリックを使用する場合、生の型を使用することの影響を理解することが重要です。 raw 型は、型パラメーターが指定されていない単なるジェネリック型への参照です。

問題

次のコードを考えてみましょう:

ArrayList<String> a = new ArrayList<>();
String[] s = a.toArray(new String[0]);
ログイン後にコピー

toArray は 型の配列を受け入れる汎用メソッドであるため、このコードは正常にコンパイルされます。その引数として。ただし、ArrayList 参照が raw 型として宣言されている場合:

ArrayList a = new ArrayList();
String[] s = a.toArray(new String[0]);
ログイン後にコピー

コンパイラは、String[] が必要であるが Object[] が見つかったことを示すエラーを生成します。これは、コンパイラーが、引数として String[] を受け取っているにもかかわらず、ジェネリック メソッドが Object[] を返すものとして解釈するためです。

生の型について

この動作を理解するには、次のようにします。 raw 型を使用すると、型パラメータを指定できなくなることを認識することが重要です。 Java 言語仕様 (JLS) では、生の型について次のように規定されています。

「スーパークラスまたはスーパーインターフェイスから継承されていない生の型 C のコンストラクター、インスタンス メソッド、または非静的フィールド M の型」は、C に対応するジェネリック宣言内の型の消去に対応する生の型です。"

言い換えると、生の型内のすべてのジェネリック メソッドとフィールドは、あたかも生の型であるかのように扱われます。

ジェネリック メソッドの影響

これは、ジェネリック メソッド呼び出しのターゲットとして raw 型を使用すると、コンパイラは推論できないことを意味します。メソッドの型パラメータ。その結果、メソッドは引数の型パラメータに対してのみジェネリックであるとみなされます。この例では、String[] 引数を渡したので、toArray メソッドは として扱われます。したがって、戻り値の型は T[] となり、String[] と同等です。

参考文献

  • [JLS 4.8: Rawタイプ](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.8)
  • [Java チュートリアル: ジェネリック](https:/ /docs.oracle.com/javase/tutorial/java/generics/)

以上がJava でジェネリック メソッドで生の型を使用すると型エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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