這是我遇到的一個縮小范例。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 –