ホームページ  >  記事  >  Java  >  リスト参照に生の型を使用すると、ジェネリック メソッドの使用が妨げられるのはなぜですか?

リスト参照に生の型を使用すると、ジェネリック メソッドの使用が妨げられるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-11 22:38:02464ブラウズ

Why Does Using a Raw Type for a List Reference Prevent Generic Method Usage?

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

次のコード スニペットを考えてみましょう:

ArrayList<String> a = new ArrayList<String>();
String[] s = a.toArray(new String[0]);

このコードは Java 6 と 7 の両方で正常にコンパイルされます。ただし、List 参照が raw 型として宣言されている場合:

ArrayList a = new ArrayList();
String[] s = a.toArray(new String[0]);

これは、String[] が必要であるが Object[] が見つかったことを示すコンパイラ エラーになります。 toArray メソッドのシグネチャが

<T> T[] toArray(T[] a);

であることを考えると、この動作は予期せぬものです。これは、メソッドがパラメータ化されており、その型パラメータが List の型パラメータと無関係であることを示しています。

このコードがコンパイルされない理由としては、インスタンス参照に生の型を使用すると、そのインスタンス メンバーのジェネリックスを使用する機能が無効になることに注意することが重要です。次のスニペットに示すように、この動作はジェネリック メソッドに限定されません:

public class MyContainer<T> {
    public List<String> strings() {
        return Arrays.asList("a", "b");
    }
}

MyContainer container = new MyContainer<Integer>();
List<String> strings = container.strings(); // This line will produce an unchecked warning!

この制限は Java 言語仕様 (4.8) で指定されています:

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

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

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