所以这是我的代码:

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扩展了Writable,因此抑制此警告是否安全?

最佳答案

之所以收到警告,是因为WritableFactories.newInstance返回一个Writable,而您的T扩展了Writable,因此它可能不是安全的转换。但是,由于将Class<T>用作newInstance的参数,因此可以禁止显示此警告。

最好将valueClass存储为Class<T>并使用Class#cast进行强制转换,这样您的方法就不会再有难看的@SuppressWarnings了。

10-05 18:30