我有一个班级:
public class SomeClass <TView extends View>{
private TView tv;
public SomeClass(View v){
tv=(TView) v; //unchecked cast warning
}
}
View
是一个具体的类(不是抽象的,不是接口)。
问题
为什么即使TView
延伸View
,我也会收到未经检查的投射警告?
答案 0 :(得分:4)
演员表未在运行时强制执行。
您的课程帖子 - erasure如下:
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
不会在运行时检查任何内容,这就是您收到警告的原因。
答案 1 :(得分:2)
是的,但View
不会延伸TView
,这意味着View
的实例可能不是TView
的实例。
想象一下View
,以及ViewA extends View
和ViewB extends View
如果您创建SomeClass<ViewA>
并致电new SomeClass<ViewA>((View)new ViewB())
,则可能会导致一些问题。例如,以下测试会在行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
。