Java 未选中的强制类型转换和泛型类
我有一门课:Java 未选中的强制类型转换和泛型类,java,generics,Java,Generics,我有一门课: public class SomeClass <TView extends View>{ private TView tv; public SomeClass(View v){ tv=(TView) v; //unchecked cast warning } } 公共类SomeClass{ 私人电视台; 公共类(视图五){ tv=(TView)v;//未选中的演员阵容警告 } } View是一个具体的类(不是抽象的,不是
public class SomeClass <TView extends View>{
private TView tv;
public SomeClass(View v){
tv=(TView) v; //unchecked cast warning
}
}
公共类SomeClass{
私人电视台;
公共类(视图五){
tv=(TView)v;//未选中的演员阵容警告
}
}
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
,这意味着视图
的实例可能不是TView
的实例
想象一下视图
,视图A扩展视图
和视图B扩展视图
如果创建SomeClass
并调用newsomeclass((View)new ViewB())
可能会导致一些问题。例如,下面的测试将在viewaoa=o.getT()行抛出一个ClassCastException
代码>
类视图{}
类ViewA{}
类ViewB{}
其他类{
T;
其他(视图){
t=(t)视图;
}
T getT(){
返回T;
}
}
@试验
公开无效测试(){
ViewA a=新ViewA();
ViewB=新ViewB();
其他o=新的其他((视图)b);
viewaoa=o.getT();
}
由于ClassCastException
每天学习新东西,上述编译输出将失败。
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();
}