1

所以这是我的代码:

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,那么抑制这个警告是否安全?

4

3 回答 3

4

您收到警告是因为WritableFactories.newInstance返回 aWritable和您的T extends Writable,所以它可能不是一个安全的演员表。但是,由于您将其Class<T>用作参数,newInstance因此可以安全地禁止此警告。

valueClass存储为Class<T>和使用Class#cast为您投射可能会更好,那么您@SuppressWarnings的方法就不会有任何难看的东西了。

于 2012-04-04T22:13:49.873 回答
3

所有T的都是Writable,但不是所有Writable的都是Ts。因此,当您将 aWritable转换为T时,不能确定 theWritable实际上a T

例如,假设有一个S extends Writable. newInstance可能是 a而不是a S,但它仍然是- 但将其转换为会给你一个.TWritableTClassCastException

于 2012-04-04T22:12:14.357 回答
1

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

于 2012-04-04T22:12:44.980 回答