十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
今天小編就為大家?guī)硪黄嘘P(guān)java泛型類型擦除的文章。小編覺得知識(shí)點(diǎn)挺豐富的,為此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

我們都知道泛型本質(zhì)上是提供類型的"類型參數(shù)",它們也被稱為參數(shù)化類型(parameterized type)或參量多態(tài)(parametric polymorphism)。其實(shí)泛型思想并不是 Java 最先引入的,C++ 中的模板就是一個(gè)運(yùn)用泛型的例子。
GJ(Generic Java)是對(duì) Java 語言的一種擴(kuò)展,是一種帶有參數(shù)化類型的 Java 語言。用 GJ 編寫的程序看起來和普通的 Java 程序基本相同,只不過多了一些參數(shù)化的類型同時(shí)少了一些類型轉(zhuǎn)換。實(shí)際上,這些 GJ 程序也是首先被轉(zhuǎn)化成一般的不帶泛型的 Java 程序后再進(jìn)行處理的,編譯器自動(dòng)完成了從 Generic Java 到普通 Java 的翻譯。

什么是真實(shí)的java泛型
我們都知道編譯器會(huì)進(jìn)行泛型擦除,編譯器可以在對(duì)源程序(帶有泛型的 Java 代碼)進(jìn)行編譯時(shí)使用泛型類型信息保證類型安全,對(duì)大量如果沒有泛型就不會(huì)去驗(yàn)證的類型安全約束進(jìn)行驗(yàn)證,同時(shí)在生成的字節(jié)碼當(dāng)中,將這些類型信息清除掉。下面我們先驗(yàn)證一下:
public static void main(String[] args) {
ArrayList ints = new ArrayList();
ints.add(1);
ints.add(2);
ints.add(3);
ArrayList sts = new ArrayList();
sts.add("a");
sts.add("b");
sts.add("c");
System.out.println(ints.getClass() == sts.getClass());
} 上面打印的結(jié)果是true,原因是
按照理解,泛型擦除后將不能找回原來的類型,都是Object形式的,真的如此嗎?
看一下如下代碼:
import java.lang.reflect.ParameterizedType;import java.util.ArrayList;import java.util.List;public class ClassTest {
public static void main(String[] args) throws Exception {
ParameterizedType type = (ParameterizedType)
Bar.class.getGenericSuperclass();
System.out.println(type.getActualTypeArguments()[0]);
ParameterizedType fieldType = (ParameterizedType)
Foo.class.getField("children").getGenericType();
System.out.println(fieldType.getActualTypeArguments()[0]);
ParameterizedType paramType = (ParameterizedType)
Foo.class.getMethod("foo", List.class)
.getGenericParameterTypes()[0];
System.out.println(paramType.getActualTypeArguments()[0]);
System.out.println(Foo.class.getTypeParameters()[0]
.getBounds()[0]);
}
class Foo {
public List children = new ArrayList();
public List foo(List foo) {return null; }
public void bar(List extends String> param) {}
}
class Bar extends Foo {}
} 打印出
class java.lang.Stringclass com.javapuzzle.davidwang456.ClassTest$Barclass java.lang.Stringinterface java.lang.CharSequence
你會(huì)發(fā)現(xiàn)每一個(gè)類型參數(shù)都被保留了,而且在運(yùn)行期可以通過反射機(jī)制獲取到。那么到底什么是“類型擦除”?至少某些東西被擦除了吧?是的。事實(shí)上,除了結(jié)構(gòu)化信息外的所有東西都被擦除了 —— 這里結(jié)構(gòu)化信息是指與類結(jié)構(gòu)相關(guān)的信息,而不是與程序執(zhí)行流程有關(guān)的。換言之,與類及其字段和方法的類型參數(shù)相關(guān)的元數(shù)據(jù)都會(huì)被保留下來,可以通過反射獲取到。
看完上述內(nèi)容,你們對(duì)java泛型類型大概了解了嗎?如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。