这是我遇到的一个缩小范例。Java泛型::未能提供类型安全性?
看看下面的代码:
class Holder<T> {
private T t;
public Holder(T t) {
this.t = t;
}
public T getValue() {
return t;
}
}
public class FooMain {
private static Object newHolder() {
return new Holder<Integer>(3);
}
public static void main(String args[]) {
Holder<String> hs = (Holder<String>) newHolder(); // line-18
String s = hs.getValue(); // line-19
}
}
什么吓到我的是,必然ClassCastException
被扔在线19而不是线18!
因此,在您的代码中有一个类型为Holder<String>
的对象不足以保证getValue
将返回String
。你还必须研究这个对象是如何构造的!
我知道Type Erasure在这里扮演一个角色,但我不确定上面的影响有多广。在我的特殊情况下,newHolder
-相应的方法在外部库中定义并返回java.lang.Object
,所以我必须执行这些转换。
您假定由外部库方法Object newHolder()返回的对象将是Holder,因此,尽管有编译器警告,但是明确地转换了结果。这意味着你正在告诉编译器 - *我知道的更好。*但是你的假设是错误的。在作出这样的决定时,你不应该做出假设,而应该百分之百确定。 –
相关:http://stackoverflow.com/a/12209857/697449 –