真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java泛型類型擦除的介紹

今天小編就為大家?guī)硪黄嘘P(guān)java泛型類型擦除的文章。小編覺得知識點(diǎn)挺豐富的,為此分享給大家做個參考。一起跟隨小編過來看看吧。

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)什邡免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

我們都知道泛型本質(zhì)上是提供類型的"類型參數(shù)",它們也被稱為參數(shù)化類型(parameterized type)或參量多態(tài)(parametric polymorphism)。其實泛型思想并不是 Java 最先引入的,C++ 中的模板就是一個運(yùn)用泛型的例子。

GJ(Generic Java)是對 Java 語言的一種擴(kuò)展,是一種帶有參數(shù)化類型的 Java 語言。用 GJ 編寫的程序看起來和普通的 Java 程序基本相同,只不過多了一些參數(shù)化的類型同時少了一些類型轉(zhuǎn)換。實際上,這些 GJ 程序也是首先被轉(zhuǎn)化成一般的不帶泛型的 Java 程序后再進(jìn)行處理的,編譯器自動完成了從 Generic Java 到普通 Java 的翻譯。

java泛型類型擦除的介紹

什么是真實的java泛型

我們都知道編譯器會進(jìn)行泛型擦除,編譯器可以在對源程序(帶有泛型的 Java 代碼)進(jìn)行編譯時使用泛型類型信息保證類型安全,對大量如果沒有泛型就不會去驗證的類型安全約束進(jìn)行驗證,同時在生成的字節(jié)碼當(dāng)中,將這些類型信息清除掉。下面我們先驗證一下:

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 param) {}
     }     
     class Bar extends Foo {}
    }

打印出

class java.lang.Stringclass com.javapuzzle.davidwang456.ClassTest$Barclass java.lang.Stringinterface java.lang.CharSequence

你會發(fā)現(xiàn)每一個類型參數(shù)都被保留了,而且在運(yùn)行期可以通過反射機(jī)制獲取到。那么到底什么是“類型擦除”?至少某些東西被擦除了吧?是的。事實上,除了結(jié)構(gòu)化信息外的所有東西都被擦除了 —— 這里結(jié)構(gòu)化信息是指與類結(jié)構(gòu)相關(guān)的信息,而不是與程序執(zhí)行流程有關(guān)的。換言之,與類及其字段和方法的類型參數(shù)相關(guān)的元數(shù)據(jù)都會被保留下來,可以通過反射獲取到。

看完上述內(nèi)容,你們對java泛型類型大概了解了嗎?如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


名稱欄目:java泛型類型擦除的介紹
分享鏈接:http://weahome.cn/article/gcejph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部