簡體   English   中英

泛型和ClassCastException

[英]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 ,因為你不能施放LongCharSequence (注意這個問題說3l不是31 )。 但是,它不會嘗試在該點轉換為String ,因為在運行時不知道類型T

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM