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

aとextendsWritableFactories.newInstanceを返すため、警告が表示されるため、安全なキャストではない可能性があります。ただし、引数として使用しているため、この警告を抑制しても安全です。WritableT WritableClass<T>newInstance

valueClassas として保存し、キャストにClass<T>使用するほうがよい場合があります。そうすれば、メソッドに醜いものがぶら下がるClass#castことはありません。@SuppressWarnings

于 2012-04-04T22:13:49.873 に答える
3

すべてTの はですが、すべてのがWritableであるわけではありません。したがって、 a を to にキャストすると、実際にaであるかどうかを確認できません。WritableTWritableTWritableT

たとえば、 があったとしS extends Writableます。はであり、ではないnewInstanceかもしれませんが、それでもそうです- しかし、それを にキャストすると、が得られます。STWritableTClassCastException

于 2012-04-04T22:12:14.357 に答える
1

すべての T は書き込み可能ですが、すべての書き込み可能が T であるとは限りません

于 2012-04-04T22:12:44.980 に答える