繁体   English   中英

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

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

ViewView不会在运行时检查任何内容,这就是您收到警告的原因。

是的,但是View没有扩展TView ,这意味着View的实例可能不是TView的实例。

想象一下ViewViewA extends ViewViewB 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM