、ジョンスキートとして、あなたの変数宣言で生タイプを使用している、と述べました。
Generic gen=new Generic(1,2);
int a=gen.get_a();
それは動作しません 、あなたは変数を宣言するときにそれを指定しない場合、コンパイラが型を推測することはできません
required:int Found:Java.Lang.Object
できます。
全くタイプの引数が渡されていないときTは、 プリミティブすることはできませんので、だから、消去はObject型とTが置き換えられますか?
型を使用するには、宣言でクラスを指定する必要があります。プリミティブはクラスではありません。 Generic<int> gen = new Generic<>(1);
だから
をコンパイルしませんあなたは整数値を使用して、インスタンスを入力したい場合は、int型のプリミティブのラッパーオブジェクトを指定する必要があります。 Generic<Integer> gen = new Generic<>(1);
あなたとコレクション変数を宣言するときに、気づいたそれを行っている必要があります数値型に依存するジェネリックス。
Object
は、Javaのルートクラスであり、あなたのケースでT
は、明示的なクラスを拡張しないよう、T
が暗黙のうちにObject
に由来します。
変数に生の型を使用すると、オブジェクトを操作できます。
私は、コンパイラがT
の最も具体的かつ互換性のある型であり、あなたのケースではObject
の返された型が不特定のT
であるとみなすと考えます。
コレクションの動作は同じです。コンパイル時にjava.util.List
は、T
に遭遇したときにObject
を操作します。
編集:ここで 、私の代わりに宣言型で、生タイプであることを示すために、あなたに別の例を与えるクラスで宣言された型を拡張する場合、Object
クラスは、必ずしもコンパイラが使用されていません別のクラス。あなたが思うかもしれないものとは反対に。
Generic
クラスがそのように宣言された場合は、次の
public class Generic<T extends MyClass>{
...
}
でも、変数の宣言で生タイプを使用してT
ための最も具体的かつ互換性のあるタイプではないので、get_a()
はMyClass
オブジェクトを返しますがObject
でもMyClass
である。
Generic gen = new Generic(1);
MyClass myClass = gen.get_a(new MyClass());
基本的には、生のタイプを使用しています。ありがとう –
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html#Rawタイプを参照してください!!私は今それを得た –