摘要:為什么使用泛型泛型類和泛型方法同時(shí)具備可重用性類型安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用與集合以及作用于集合的方法一起使用。泛型方法泛型方法,是在調(diào)用方法的時(shí)候指明泛型的具體類型。
為什么使用泛型
泛型類和泛型方法同時(shí)具備可重用性、類型安全和效率,這是非泛型類和非泛型方法無法具備的。 泛型通常用與集合以及作用于集合的方法一起使用。
可重用性:
比如要返回兩個(gè)信息,一種是String類型的信息,一種是Integer類型的信息。
不使用泛型的話我們要添加兩個(gè)方法,一個(gè)返回字符串,另一個(gè)返回?cái)?shù)值類型 。
public String getString(String stringMessage){ return stringMessage; } public Integer getInteger(Integer integerMessage){ return integerMessage; }
而使用泛型
public class Generic{ private T key; public Generic(T key) { this.key = key; } public T getKey() { return key; } }
(如果用字符串和數(shù)值的強(qiáng)制轉(zhuǎn)換,不使用泛型也可以用一個(gè)方法實(shí)現(xiàn),但是有類型安全和高效率方面的問題)
類型安全:
先來看一下List的實(shí)現(xiàn)方式了。在List中可以放各種各樣的數(shù)據(jù)類型,不論你push中的元素是什么,都變?yōu)镺bject類型。而且值類型向Object轉(zhuǎn)換時(shí),還得采取裝箱操作,拿出來還得拆箱操作,很容易出現(xiàn)InvalidCastException異常。而泛型集合一旦聲明了是何種數(shù)據(jù)類型的集合,就只能添加何種數(shù)據(jù)類型,不會(huì)轉(zhuǎn)換成Object。
高效率
泛型集合一旦聲明了是何種數(shù)據(jù)類型的集合,就只能添加何種數(shù)據(jù)類型。添加去也不會(huì)轉(zhuǎn)換成Object,它是運(yùn)行時(shí)動(dòng)態(tài)的獲取類型參數(shù)。也就是說沒有裝箱和拆箱這些操作。減少了處理器的資源浪費(fèi)。
泛型只在編譯階段有效。看下面的代碼:
ListstringArrayList = new ArrayList (); List integerArrayList = new ArrayList (); Class classStringArrayList = stringArrayList.getClass(); Class classIntegerArrayList = integerArrayList.getClass(); if(classStringArrayList.equals(classIntegerArrayList)){ Log.d("泛型測(cè)試","類型相同"); }
輸出結(jié)果:D/泛型測(cè)試: 類型相同。
通過上面的例子可以證明,在編譯之后程序會(huì)采取去泛型化的措施。也就是說Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗(yàn)泛型結(jié)果后,會(huì)將泛型的相關(guān)信息擦出,并且在對(duì)象進(jìn)入和離開方法的邊界處添加類型檢查和類型轉(zhuǎn)換的方法。也就是說,泛型信息不會(huì)進(jìn)入到運(yùn)行時(shí)階段。
泛型方法泛型方法,是在調(diào)用方法的時(shí)候指明泛型的具體類型 。
下面的例子演示了如何使用泛型方法打印不同字符串的元素:
public class GenericMethodTest { // 泛型方法 printArray public static < E > void printArray( E[] inputArray ) { // 輸出數(shù)組元素 for ( E element : inputArray ){ System.out.printf( "%s ", element ); } System.out.println(); } public static void main( String args[] ) { // 創(chuàng)建不同類型數(shù)組: Integer, Double 和 Character Integer[] intArray = { 1, 2, 3, 4, 5 }; Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; Character[] charArray = { "H", "E", "L", "L", "O" }; System.out.print( "整型數(shù)組元素為:" ); printArray( intArray ); // 傳遞一個(gè)整型數(shù)組 System.out.print( " 雙精度型數(shù)組元素為:" ); printArray( doubleArray ); // 傳遞一個(gè)雙精度型數(shù)組 System.out.print( " 字符型數(shù)組元素為:" ); printArray( charArray ); // 傳遞一個(gè)字符型數(shù)組 } }
編譯以上代碼,運(yùn)行結(jié)果如下所示:
整型數(shù)組元素為:1 2 3 4 5
雙精度型數(shù)組元素為:1.1 2.2 3.3 4.4
字符型數(shù)組元素為:H E L L O
類型通配符類型通配符一般是使用?代替具體的類型參數(shù)。例如 List> 在邏輯上是List
public class GenericTest { public static void main(String[] args) { Listname = new ArrayList (); List age = new ArrayList (); List number = new ArrayList (); name.add("icon"); age.add(18); number.add(314); getData(name); getData(age); getData(number); } public static void getData(List> data) { System.out.println("data :" + data.get(0)); } }
輸出結(jié)果為:
data :icon
data :18
data :314
在java中是”不能創(chuàng)建一個(gè)確切的泛型類型的數(shù)組”的。
下面的這個(gè)例子是不可以的,編譯階段會(huì)直接提示錯(cuò)誤:
List[] ls = new ArrayList [10];
而使用通配符創(chuàng)建泛型數(shù)組是可以的,如下面這個(gè)例子:
List>[] ls = new ArrayList>[10];
這樣也是可以的:
List[] ls = new ArrayList[10];
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/76424.html
摘要:首先,我們來按照泛型的標(biāo)準(zhǔn)重新設(shè)計(jì)一下類。注意參數(shù)為而不是泛型。利用形式的通配符,可以實(shí)現(xiàn)泛型的向上轉(zhuǎn)型,來看例子。需要注意的是,無法從這樣類型的中取出數(shù)據(jù)。showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac3bf3eb16160c); 00、故事的起源 二哥,要不我上大學(xué)的時(shí)候也學(xué)習(xí)編程吧?有一天,三妹突發(fā)奇想地問我。 你確定要做一名...
摘要:接口也是集合中的一員,但它與接口有所不同,接口與接口主要用于存儲(chǔ)元素,而主要用于迭代訪問即遍歷中的元素,因此對(duì)象也被稱為迭代器。迭代器的實(shí)現(xiàn)原理我們?cè)谥鞍咐呀?jīng)完成了遍歷集合的整個(gè)過程。 【Collection、泛型】 主要內(nèi)容 Collection集合 迭代器 增強(qiáng)for 泛型 教學(xué)目標(biāo) [ ] 能夠說出集合與數(shù)組的區(qū)別 [ ] 說出Collection集合的常用功能 [ ]...
摘要:靜態(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可以在泛型類的方法中取得...
摘要:以上代碼編譯通過,運(yùn)行通過引入泛型的同時(shí),也為了兼容之前的類庫,開始引入的其實(shí)是偽泛型,在生成的字節(jié)碼中是不包含泛型中的類型信息的。進(jìn)行類型擦除后,類型參數(shù)原始類型就是擦除去了泛型信息,最后在字節(jié)碼中的類型變量的真正類型。 Java泛型 Java泛型(generics)是JDK 5中引入的一個(gè)新特性,允許在定義類和接口的時(shí)候使用類型參數(shù)(type parameter)。聲明的類型參數(shù)在...
閱讀 2385·2023-04-25 19:27
閱讀 3495·2021-11-24 09:39
閱讀 3911·2021-10-08 10:17
閱讀 3402·2019-08-30 13:48
閱讀 1937·2019-08-29 12:26
閱讀 3127·2019-08-28 17:52
閱讀 3542·2019-08-26 14:01
閱讀 3539·2019-08-26 12:19