[英]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.