[英]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.