私は、ジェネリック医薬品に新しいですし、記事で読む「などのパラメータ化された型、ArrayList<T>
-私たちはそれらのインスタンスを作成することはできません、インスタンス化できません」。
Javaから一言で完全な引用、:
パラメータ化された型は、このような
ArrayList<T>
、インスタンス化ではありません-私たちは、それらのインスタンスを作成することはできません。これは、<T>
本物のタイプのための単なるプレースホルダ-ちょうどtypeパラメータです。私たちは、typeパラメータの具体的な値を提供する場合、それは唯一である、(例えば、ArrayList<String>
)、型が完全に形成された状態になると、我々はその型のオブジェクトを作成することができます。我々が仕事をしたいというタイプがコンパイル時に不明である場合、これは問題となります。幸いなことに、Javaの型システムでは、この概念に対応することができます。それはのように表される未知のタイプの明示的な考え方を持っていることによってそれを行います
<?>
。
私は具体的な(実際の)型が知られていないので、それはインスタンス化すべきではないことを理解しています。もしそうなら、なぜエラーなしでコードのコンパイルの下にいますか?
public class SampleTest {
public static <T> List<T> getList(T... elements) {
List<T> lst = new ArrayList<>(); // shouldn't this line return an error?
return lst;
}
}
私はここで、ジェネリックの私の理解にギャップが存在しているはず。缶誰かのポイントは何かを私はここで行方不明ですか?
メソッドが呼び出されるまでオブジェクト「LST」が実際に初期化されていないので、あなたが言及していること、コードはコンパイルすることができます。この方法は、それが型TのVAR-args引数を取得することを知っているので、このシナリオでコンパイルすることができます。例えば、以下の例のラッパークラスを取ります:
public class Wrapper<T> {
public static <T> List<T> getList(T... elements){
List<T> lst = new ArrayList<>();
for(T element: elements) {
lst.add(element);
}
return lst;
}
}
メソッドが呼び出されていないので、このコードはコンパイルすることができます。メソッドが呼び出されると、タイプTは、我々は、VAR-args引数として渡すとコードは何の問題はコンパイルしない持っていることを型になります。私たちの主な方法でこれをテストすることができます:
public static void main( String[] args ){
System.out.println(Wrapper.getList("Hi", "Hello", "Yo"));
}
そして、出力は次のようになります。
[Hi, Hello, Yo]
しかし、記事では、私たちの主なメソッド内で話しているかを見るために、コンパイル時エラーを生成することができます:
Wrapper<T> myWrap = new Wrapper<>();
私たちは、実際には上記のコードでラッパークラスの一般的なオブジェクト初期化しようとしますが、不明であるされています。それがで初期化されますので、プレースホルダの値は、我々はメソッドを呼び出す場合でも、GETLISTメソッド内で型Tのリストを作成することは、コンパイル時エラーが発生しないのに対し、それは、コンパイル時にエラーになり不明となりますので、メソッドが呼び出されるタイプ。