[英]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>
。
將View
為View
不會在運行時檢查任何內容,這就是您收到警告的原因。
是的,但是View
沒有擴展TView
,這意味着View
的實例可能不是TView
的實例。
想象一下View
, ViewA extends View
和ViewB 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.