Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未选中的强制类型转换和泛型类_Java_Generics - Fatal编程技术网

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();
}