2010-12-05 11 views
2

私はこのクラスの定義に従っています。Javaジェネリックスの質問

public class Test2<T extends Test3> { 

    private T t ; 


    public T foo() { 
     Test3 test3 = new Test3(); 
     t = test3; // I get compilation error here.** 
     return t; 
    } 

} 

class Test3 { 

} 

私は型の不一致がTにTest3はから変換することはできません」と言って、ライントン= TEST3でコンパイル・エラーが発生します。 間違っている何

+0

子オブジェクト変数は親オブジェクトを参照できますか? –

+1

@Hovercraft:いいえ、それは正確に問題です(私の答えを参照してください)。 –

+1

私はマーク、私はOPにそれを理解したかったが、私は解答ではなくコメントとして投稿した。 : –

答えて

8

あなたがやっていることはこれに相当します?

Integer n = new Number(); 

とジェネリックとは何の関係もありません(Integer extends Numberことに注意してください)。コンパイラはあなたが親タイプはすべての子タイプの必要なメソッドを実装していないことが、子型のインスタンスに親の型を割り当てることはできませんを示している。

この場合、Tは、子タイプTest3またはTest3です。ここでは、子クラス(Test3)を含む変数に親クラス(T)を割り当てようとしていますが、上の例のように失敗します。

2

TTest3のサブクラスです。そのため、正確にTest3でなければ、サブクラスをスーパークラス型の変数に割り当てることができますが、その逆は真ではないので、代入は失敗します。

0

ダウンキャストですので。あなたは必ず(しかし、なぜあなたは常にTest3はを使用し、Tを必要とする)明示的なキャストをたどる使用できる場合Tは、Test3は由来する任意のクラスになります

@SuppressWarnings("unchecked") 
t = (T)test3; 
+0

私はTest3のインスタンスを返すしたいです。 ? – Neel

+0

私は以下のようにキャストすれば醜いだろうか?@SuppressWarnings( "unchecked") t =(T)test3; – Neel

1

子オブジェクト変数は、親オブジェクトを参照することができますか?

ただ、ジェネリックせずにそれをテスト:

public class Foo { 

    public static void main(String args[]) { 
     T t = new Test3(); 
    } 
} 

class T extends Test3 { 
} 

class Test3 { 
} 

編集を:用事、私は当初、その後の答えとして投稿、コメントとして掲載...しかし、遅すぎました! :)