[英]Generics and ClassCastException
鑒於以下代碼:
public class ClassCastTest {
private static class GenericHolder<T> {
private T object;
public GenericHolder(Object object) {
this.object = (T) object;
System.out.println(getObject());
}
public T getObject() {
return object;
}
}
public static void main(String[] args) {
GenericHolder<String> foo = new GenericHolder<>(3l);
System.out.println(foo.getObject());
}
}
為什么Java在main方法的第二行而不是GenericHolder的第二行拋出ClassCastException?
由於泛型在語言中的實現方式,您對(T)
強制轉換實際上並沒有做任何事情。 只有當你以一種實際輸出具體類型的方式使用泛型類型時 - 這里, System.out.println
需要一個String
並且它執行轉換才能獲得它 - 運行時實際上進行任何轉換。
就Java運行時而言, GenericHolder<String>
和GenericHolder<Integer>
之間沒有區別; 他們都持有一個Object
。 Java只是在從泛型類型中獲取具體類型的任何位置插入強制轉換。
研究類型擦除更多細節。
除了路易斯的回答,這是非常有用指出,鑄造一個T
寫(T)
該情況不‘做點什么’ T
是有界的。 例如,如果你寫
private static class GenericHolder<T extends CharSequence>
相反,然后線
this.object = (T) object;
並拋出一個ClassCastException
,因為你不能施放Long
到CharSequence
(注意這個問題說3l
不是31
)。 但是,它不會嘗試在該點轉換為String
,因為在運行時不知道類型T
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.