簡體   English   中英

未經檢查的強制轉換和泛型類

[英]Unchecked cast and generic class

我有一節課:

public class SomeClass <TView extends View>{

    private TView tv;

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

}

View是一個具體的類(不是抽象的,不是接口)。

問題是

為什么即使TView擴展了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
    }

}

注意,刪除后,構造是鑄造的類型的值View輸入View自認為是下界為<TView extends View>

ViewView不會在運行時檢查任何內容,這就是您收到警告的原因。

是的,但是View沒有擴展TView ,這意味着View的實例可能不是TView的實例。

想象一下ViewViewA extends ViewViewB extends View

如果您創建SomeClass<ViewA>並調用new SomeClass<ViewA>((View)new ViewB())您可能會導致一些問題。 例如,下面的測試將在ViewA oa = o.getT();行拋出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 ,上面的編譯put將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM