2017-01-03 6 views
1

は、私はインスタンス化した場合、汎用のように:は、Javaのジェネリックは、クラスのインスタンスは、型引数なしで以下のコードで

int a=gen.get_a(); 

それはない:私はこれを行うときに、type引数なしで

Generic gen=new Generic(1,2); 

仕事と必要な

を与える:実測値intです:java.lang.Objectの

しかし、ob.print()が動作します。 だから私はこれを代わりに行う:

int a=(Integer)gen.get_a(); 

それが動作します。したがって、をObject型に置き換えます。Tは、型引数が渡されないとき、プリミティブにすることはできません。ここで

public class Generic<T> 
{ 
    T a; 
    Generic(T a) 
    { 
     this.a=a; 
    } 
    void print() 
    { 
     System.out.print(a); 
    } 

    T get_a() 
    { 
     return a; 
    } 
} 
+2

基本的には、生のタイプを使用しています。ありがとう –

+0

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html#Rawタイプを参照してください!!私は今それを得た –

答えて

2

、ジョンスキートとして、あなたの変数宣言で生タイプを使用している、と述べました。

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()); 
+0

ありがとう。 java.lang.Number型 あなたが例に示したとおり、私はそれは が見つかり言う追加した場合、私は私のコードで、今それを得ました。ありがとうございました!!私が言うのならば:) 別の質問は、私を襲った: LinkedListのリスト=新しいLinkedListのを<>(); リスト l =リスト; これは動作しませんが、私は知っていますが、仮定します。 List l_interface = list これは動作しますが、l_interfaceも生の型です。つまり、l_interfaceもオブジェクトを暗黙的に派生させますか? I –

+0

あなたは大歓迎です:) 'List l_interface'宣言は何かのリストです。したがって、コンパイラはジェネリック型を最も一般的な型、 'Object'に置き換えます。 あなたが書くとき 'LinkedListのリスト= ...; List l_interface = list'では、ジェネリックを使用してリストオブジェクトを、生のリストである参照に割り当てます。コンパイラはそれをやってからあなたを防ぐことはできませんが、それは(警告)警告を出し、このリストは、オブジェクトのリスト。.. – davidxxx

+0

おかげですので、あなたは、一般的なメカニズムを失います! :)これは、今日のこれらを介してジェネリックスと生のタイプについてたくさん理解しました。 –

関連する問題