摘要:泛型的參數(shù)只可以代表類,不能代表個(gè)別對(duì)象。生成的字節(jié)代碼中不包含類型信息例如編譯后看到的只是靜態(tài)變量是被泛型類的所有實(shí)例所共享的。對(duì)于聲明為的類,訪問其中的靜態(tài)變量的方法仍然是。不管是通過還是創(chuàng)建的對(duì)象,都是共享一個(gè)靜態(tài)變量。
Java泛型的參數(shù)只可以代表類,不能代表個(gè)別對(duì)象。
由于Java泛型的類型參數(shù)之實(shí)際類型在編譯時(shí)會(huì)被消除,所以無法在運(yùn)行時(shí)得知其類型參數(shù)的類型。
In Java, generics are only checked at compile time for type correctness. The generic type information is then removed via a process called type erasure, to maintain compatibility with old JVM implementations, making it unavailable at runtime.
Java編譯程序在編譯泛型時(shí)會(huì)自動(dòng)加入類型轉(zhuǎn)換的編碼
類型擦除For example, a List
is converted to the raw type List. The compiler inserts type casts to convert the elements to the String type when they are retrieved from the list, reducing performance compared to other implementations such as C++ templates.
Java的泛型在編譯器這個(gè)層次上實(shí)現(xiàn),使用泛型的時(shí)候加上的類型參數(shù)會(huì)在編譯的時(shí)候去掉。生成的Java字節(jié)代碼中不包含類型信息(例如List
靜態(tài)變量是被泛型類的所有實(shí)例所共享的。對(duì)于聲明為 MyClass
泛型的類型參數(shù)不能用在Java異常處理的 catch 語句中。因?yàn)楫惓L幚硎怯蒍VM在運(yùn)行時(shí)刻來進(jìn)行的。由于類型信息被擦除,JVM是無法區(qū)分兩個(gè)異常類型 MyException
一個(gè)方法如果接收 List 作為形式參數(shù),但是如果嘗試將一個(gè) List
但是如果使用 List extends Object> 或者 List super String> 則不會(huì)
public void inspect(List extends Object> list) { for (Object obj : list) { System.out.println(obj); } } public void test() { ArrayListstrs = new ArrayList (); inspect(strs); } //不會(huì)報(bào)錯(cuò)
當(dāng)泛型類的類型聲明中使用了通配符的時(shí)候, 其子類型可以在兩個(gè)維度上分別展開。
如對(duì) Collection extends Number> 來說
其子類型可以在 Collection 這個(gè)維度上展開,即 List extends Number> 和 Set extends Number> 等;
也可以在 Number 這個(gè)層次上展開,即 Collection
如此循環(huán)下去,ArrayList
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/65837.html
摘要:引用泛型除了方法因不能使用外部實(shí)例參數(shù)外,其他繼承實(shí)現(xiàn)成員變量,成員方法,方法返回值等都可使用。因此,生成的字節(jié)碼僅包含普通的類,接口和方法。 為什么要使用泛型程序設(shè)計(jì)? 一般的類和方法,只能使用具體的類型:要么是基本類型,要么是自定義類的對(duì)應(yīng)類型;如果要編寫可以應(yīng)用于多種類型的代碼,這種刻板的限制對(duì)代碼的束縛就會(huì)很大。----摘自原書Ordinary classes and meth...
摘要:知識(shí)點(diǎn)總結(jié)泛型知識(shí)點(diǎn)總結(jié)泛型泛型泛型就是參數(shù)化類型適用于多種數(shù)據(jù)類型執(zhí)行相同的代碼泛型中的類型在使用時(shí)指定泛型歸根到底就是模版優(yōu)點(diǎn)使用泛型時(shí),在實(shí)際使用之前類型就已經(jīng)確定了,不需要強(qiáng)制類型轉(zhuǎn)換。 Java知識(shí)點(diǎn)總結(jié)(Java泛型) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java泛型] [toc] 泛型 泛型就是參數(shù)化類型 適用于多種數(shù)據(jù)類型執(zhí)行相同的代碼 泛型中的類型在使用時(shí)指定 泛...
摘要:靜態(tài)變量是被泛型類的所有實(shí)例所共享的。所以引用能完成泛型類型的檢查。對(duì)于這個(gè)類型系統(tǒng),有如下的一些規(guī)則相同類型參數(shù)的泛型類的關(guān)系取決于泛型類自身的繼承體系結(jié)構(gòu)。事實(shí)上,泛型類擴(kuò)展都不合法。 前言 和C++以模板來實(shí)現(xiàn)靜多態(tài)不同,Java基于運(yùn)行時(shí)支持選擇了泛型,兩者的實(shí)現(xiàn)原理大相庭徑。C++可以支持基本類型作為模板參數(shù),Java卻只能接受類作為泛型參數(shù);Java可以在泛型類的方法中取得...
摘要:泛型類在類的申明時(shí)指定參數(shù),即構(gòu)成了泛型類。換句話說,泛型類可以看成普通類的工廠。的作用就是指明泛型的具體類型,而類型的變量,可以用來創(chuàng)建泛型類的對(duì)象。只有聲明了的方法才是泛型方法,泛型類中的使用了泛型的成員方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一項(xiàng)新特性,它的本質(zhì)是參數(shù)化類型(Parameterized Type)的應(yīng)用,也就是說所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),...
摘要:可以看到,如果我們給泛型類制定了上限,泛型擦除之后就會(huì)被替換成類型的上限。相應(yīng)的,泛型類中定義的方法的類型也是如此。參考語言類型擦除下界通配符和的區(qū)別 本篇博客主要介紹了Java類型擦除的定義,詳細(xì)的介紹了類型擦除在Java中所出現(xiàn)的場(chǎng)景。 1. 什么是類型擦除 為了讓你們快速的對(duì)類型擦除有一個(gè)印象,首先舉一個(gè)很簡(jiǎn)單也很經(jīng)典的例子。 // 指定泛型為String List list1 ...
閱讀 3298·2021-11-12 10:36
閱讀 1450·2019-08-30 15:56
閱讀 2552·2019-08-30 11:26
閱讀 643·2019-08-29 13:00
閱讀 3661·2019-08-28 18:08
閱讀 2821·2019-08-26 17:18
閱讀 1961·2019-08-26 13:26
閱讀 2487·2019-08-26 11:39