次のコード スニペットを考えてみましょう:
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 サイトの他の関連記事を参照してください。