繁体   English   中英

为什么我会收到此泛型类型的未经检查的转换警告?

[英]Why do I get an unchecked cast warning on this generic type?

所以这是我的代码:

public class SetWritable<T extends Writable> implements Writable {      
    private Class<? extends Writable> valueClass;
    private Set<T> values;  

    public SetWritable(Class<T> valueClass) {
        this.valueClass = valueClass;
        this.values = new HashSet<T>();
    }

        public void readFields(DataInput in) throws IOException {
        values = new HashSet<T>();          
        int len = in.readInt();

        for (int i = 0; i < len; i++) {         
            //this line is where I get the warning
            //FYI, WritableFactories.newInstance returns an instance of Writable
            T value = (T) WritableFactories.newInstance(valueClass);

            value.readFields(in);               
            values.add(value);
        }
    }
}

令我困惑的是:我已经断言 T 扩展了 Writable,那么当我尝试将 Writable 转换为 T 时为什么会收到警告? 既然我知道 T extends Writable,那么抑制这个警告是否安全?

您收到警告是因为WritableFactories.newInstance返回一个Writable并且您的T扩展Writable ,因此它可能不是安全的转换。 但是,由于您使用Class<T>作为newInstance的参数,因此可以安全地取消此警告。

最好将valueClass存储为Class<T>并使用Class#cast为您进行转换,这样您的方法上就不会出现任何丑陋的@SuppressWarnings

所有T都是Writable ,但并非所有Writable都是T 因此,当您将Writable转换为T时,无法确定Writable实际上T

例如,假设有一个S extends Writable newInstance可能是S不是T ,但它仍然是Writable的——但是将它强制转换为T会给你一个ClassCastException

所有 T 都是可写的,但并非所有可写都是 T

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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