所以这是我的代码:
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
了。