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

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

Patricia Arquette
リリース: 2024-11-11 22:38:02
オリジナル
580 人が閲覧しました

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 サイトの他の関連記事を参照してください。

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