摘要:為什么使用泛型泛型類和泛型方法同時具備可重用性類型安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用與集合以及作用于集合的方法一起使用。泛型方法泛型方法,是在調用方法的時候指明泛型的具體類型。
為什么使用泛型
泛型類和泛型方法同時具備可重用性、類型安全和效率,這是非泛型類和非泛型方法無法具備的。 泛型通常用與集合以及作用于集合的方法一起使用。
可重用性:
比如要返回兩個信息,一種是String類型的信息,一種是Integer類型的信息。
不使用泛型的話我們要添加兩個方法,一個返回字符串,另一個返回數值類型 。
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; } }
(如果用字符串和數值的強制轉換,不使用泛型也可以用一個方法實現,但是有類型安全和高效率方面的問題)
類型安全:
先來看一下List的實現方式了。在List中可以放各種各樣的數據類型,不論你push中的元素是什么,都變為Object類型。而且值類型向Object轉換時,還得采取裝箱操作,拿出來還得拆箱操作,很容易出現InvalidCastException異常。而泛型集合一旦聲明了是何種數據類型的集合,就只能添加何種數據類型,不會轉換成Object。
高效率
泛型集合一旦聲明了是何種數據類型的集合,就只能添加何種數據類型。添加去也不會轉換成Object,它是運行時動態的獲取類型參數。也就是說沒有裝箱和拆箱這些操作。減少了處理器的資源浪費。
泛型只在編譯階段有效。看下面的代碼:
ListstringArrayList = new ArrayList (); List integerArrayList = new ArrayList (); Class classStringArrayList = stringArrayList.getClass(); Class classIntegerArrayList = integerArrayList.getClass(); if(classStringArrayList.equals(classIntegerArrayList)){ Log.d("泛型測試","類型相同"); }
輸出結果:D/泛型測試: 類型相同。
通過上面的例子可以證明,在編譯之后程序會采取去泛型化的措施。也就是說Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗泛型結果后,會將泛型的相關信息擦出,并且在對象進入和離開方法的邊界處添加類型檢查和類型轉換的方法。也就是說,泛型信息不會進入到運行時階段。
泛型方法泛型方法,是在調用方法的時候指明泛型的具體類型 。
下面的例子演示了如何使用泛型方法打印不同字符串的元素:
public class GenericMethodTest { // 泛型方法 printArray public static < E > void printArray( E[] inputArray ) { // 輸出數組元素 for ( E element : inputArray ){ System.out.printf( "%s ", element ); } System.out.println(); } public static void main( String args[] ) { // 創建不同類型數組: 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( "整型數組元素為:" ); printArray( intArray ); // 傳遞一個整型數組 System.out.print( " 雙精度型數組元素為:" ); printArray( doubleArray ); // 傳遞一個雙精度型數組 System.out.print( " 字符型數組元素為:" ); printArray( charArray ); // 傳遞一個字符型數組 } }
編譯以上代碼,運行結果如下所示:
整型數組元素為:1 2 3 4 5
雙精度型數組元素為:1.1 2.2 3.3 4.4
字符型數組元素為:H E L L O
類型通配符類型通配符一般是使用?代替具體的類型參數。例如 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)); } }
輸出結果為:
data :icon
data :18
data :314
在java中是”不能創建一個確切的泛型類型的數組”的。
下面的這個例子是不可以的,編譯階段會直接提示錯誤:
List[] ls = new ArrayList [10];
而使用通配符創建泛型數組是可以的,如下面這個例子:
List>[] ls = new ArrayList>[10];
這樣也是可以的:
List[] ls = new ArrayList[10];
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76424.html
摘要:首先,我們來按照泛型的標準重新設計一下類。注意參數為而不是泛型。利用形式的通配符,可以實現泛型的向上轉型,來看例子。需要注意的是,無法從這樣類型的中取出數據。showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac3bf3eb16160c); 00、故事的起源 二哥,要不我上大學的時候也學習編程吧?有一天,三妹突發奇想地問我。 你確定要做一名...
摘要:接口也是集合中的一員,但它與接口有所不同,接口與接口主要用于存儲元素,而主要用于迭代訪問即遍歷中的元素,因此對象也被稱為迭代器。迭代器的實現原理我們在之前案例已經完成了遍歷集合的整個過程。 【Collection、泛型】 主要內容 Collection集合 迭代器 增強for 泛型 教學目標 [ ] 能夠說出集合與數組的區別 [ ] 說出Collection集合的常用功能 [ ]...
摘要:靜態變量是被泛型類的所有實例所共享的。所以引用能完成泛型類型的檢查。對于這個類型系統,有如下的一些規則相同類型參數的泛型類的關系取決于泛型類自身的繼承體系結構。事實上,泛型類擴展都不合法。 前言 和C++以模板來實現靜多態不同,Java基于運行時支持選擇了泛型,兩者的實現原理大相庭徑。C++可以支持基本類型作為模板參數,Java卻只能接受類作為泛型參數;Java可以在泛型類的方法中取得...
摘要:以上代碼編譯通過,運行通過引入泛型的同時,也為了兼容之前的類庫,開始引入的其實是偽泛型,在生成的字節碼中是不包含泛型中的類型信息的。進行類型擦除后,類型參數原始類型就是擦除去了泛型信息,最后在字節碼中的類型變量的真正類型。 Java泛型 Java泛型(generics)是JDK 5中引入的一個新特性,允許在定義類和接口的時候使用類型參數(type parameter)。聲明的類型參數在...
閱讀 2361·2023-04-25 19:27
閱讀 3491·2021-11-24 09:39
閱讀 3906·2021-10-08 10:17
閱讀 3397·2019-08-30 13:48
閱讀 1930·2019-08-29 12:26
閱讀 3121·2019-08-28 17:52
閱讀 3537·2019-08-26 14:01
閱讀 3534·2019-08-26 12:19