深入理解java泛型詳解 Java為什么不能實現(xiàn)真正泛型?
Java為什么不能實現(xiàn)真正泛型?一句話回答:Java一言九鼎!Java在發(fā)布之初,就將二進制兼容這個承諾寫入了《Java虛擬機規(guī)范》中,為了兼容Java1.5之前的版本最終選擇了此方案。雖然兼容的方案
Java為什么不能實現(xiàn)真正泛型?
一句話回答:Java一言九鼎!
Java在發(fā)布之初,就將二進制兼容這個承諾寫入了《Java虛擬機規(guī)范》中,為了兼容Java1.5之前的版本最終選擇了此方案。
雖然兼容的方案不止是擦除這一條路,但是這個承諾確實是導致其沒有采用類似C#那種真泛型的方案的最重要的原因。
Java為什么要有泛型?
java里的泛型是奇葩的存在。這也是我經(jīng)常懟java的一個原因。
先說下泛型的主要作用:
1,強化類型安全,比如定義了一個List<String>,那么里面只能存放String,不允許存放其他類型(派生自String的除外)。類型安全應該在編譯和運行時都能體現(xiàn)。
2,提高性能,減少類型轉(zhuǎn)換和裝箱拆箱次數(shù)。
再說下java泛型奇葩之處:
1,java泛型實現(xiàn)的原理叫類型擦除,不管代碼中怎么定義泛型,編譯后都變成object, 因此不能實現(xiàn)運行時的類型安全。 而且java編譯器不夠聰明,可以很容易騙過去。 舉個例子,你調(diào)用了第三方的接口返回List<String>,但實際拿到的值里面可能跟String沒有半毛錢關系。
2,既然類型被擦除,那么類型轉(zhuǎn)換就不可避免了,因此使用泛型和非泛型在性能上沒有任何變化。