ジェネリック メソッドを使用した生の型の動作を理解する
Java のジェネリックスを扱う場合、生の型を使用することの影響を理解することが重要ですおよびジェネリックメソッドへの影響。特定のコード例を詳しく調べて、生の型がメソッドの解決にどのような影響を与えるかを調べてみましょう。
次のコード スニペットを考えてみましょう。ここでは、文字列の ArrayList が作成され、配列に変換されます。
ArrayList<String> a = new ArrayList<String>(); String[] s = a.toArray(new String[0]);
予想通り、このコードは Java 1.6 および 1.7 で正常にコンパイルされます。ただし、ArrayList 参照が raw 型として宣言されている場合、コンパイル中にエラーが発生します:
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]); // Error: Argument required String[] found Object[]
このシナリオでは、コンパイラはジェネリック メソッド toArray(myArray) を受け取ったにもかかわらず、Object[] を返すものとして解釈します。引数として String[] を指定します。メソッド シグネチャで型パラメーター
これを理解するために、Java 言語仕様 (JLS) セクション 4.8 を考えてみましょう。これは、「スーパークラスまたはスーパーインターフェイスから継承されていない生の型 C のインスタンス メソッド M の型は、C に対応するジェネリック宣言内のその型の消去に対応する生の型である」と述べています。
本質的に、生の型を使用する場合、コンパイラは基本的にすべての型情報を破棄し、クラスの生の表現だけを残します。これは、この例では、最初はジェネリック メソッドとして定義されていたにもかかわらず、toArray メソッドが実質的に Object[] 戻り値の型を持つ非ジェネリック メソッドになることを意味します。
生の型でのジェネリック性の喪失重要な意味があります:
一般に、生の型の使用を避け、型の安全性と柔軟性を確保するためにジェネリックを使用することをお勧めします。ただし、生の型の動作を理解すると、問題のトラブルシューティングを行い、特定のシナリオで情報に基づいた意思決定を行うのに役立ちます。
以上がジェネリック メソッドで生の型を使用すると予期しない動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。