未经检查的强制转换和泛型类

时间:2012-02-09 20:27:35

标签: java generics

我有一个班级:

public class SomeClass <TView extends View>{

    private TView tv;

    public SomeClass(View v){
        tv=(TView) v; //unchecked cast warning
    }

}

View是一个具体的类(不是抽象的,不是接口)。

问题

为什么即使TView延伸View,我也会收到未经检查的投射警告?

2 个答案:

答案 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 ViewViewB 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

,上述编译放置将失败