2012-02-09 6 views
3

未確認のキャストとジェネリッククラス

public class SomeClass <TView extends View>{ 

    private TView tv; 

    public SomeClass(View v){ 
     tv=(TView) v; //unchecked cast warning 
    } 

} 

Viewは(インタフェースではない、抽象的ではない)の具象クラスです。

質問はなぜTViewViewを拡張した場合でも、未チェックのキャストの警告を

得るのですか?

答えて

4

実行時にキャストが強制されません。それは<TView extends View>ため下限であるため、消去後、コンストラクタはViewを入力するタイプViewの値をキャストしている

public class SomeClass { 

    private View tv; // Post-erasure, TView -> View 

    public SomeClass(View v){ // Post-erasure, TView -> View 
     tv=(View) v; //unchecked cast warning due to cast of View to View 
    } 

} 

注こと:

あなたのクラス後erasureは次のようになります。

キャスティングViewViewは、実行時に何も確認しないため、警告が表示されます。

2

ええと、Viewは、TViewを拡張しません。つまり、ViewのインスタンスはTViewのインスタンスではない可能性があります。

Viewを想像して、あなたがSomeClass<ViewA>を作成し、new SomeClass<ViewA>((View)new ViewB())を呼び出した場合ViewA extends ViewViewB extends View

あなたはいくつかの問題を引き起こす可能性があります。例えば、以下の試験は、上記のコンパイルプットがClassCastExceptionのために失敗しますラインViewA oa = o.getT();

class View{} 

class ViewA{} 

class ViewB{} 

class Other<T extends View>{ 
    T t; 

    Other(View view){ 
     t= (T)view; 
    } 

    T getT(){ 
     return T; 
    } 
} 


@Test 
public void testIt(){ 
    ViewA a = new ViewA(); 
    ViewB b = new ViewB(); 
    Other<ViewA> o = new Other<ViewA>((View)b); 
    ViewA oa = o.getT(); 
} 

ClassCastExceptionがスローされます。

+0

新しい何かを毎日新しいことを学びます。 –

関連する問題