摘要:定義什么是泛型,看表面的意思,泛型就是指廣泛的普通的類型。繼承關系泛型類在繼承時,可以明確父類泛型類的參數類型,也可以不明確。參考資料泛型就是這么簡單
1、定義
什么是泛型,看表面的意思,泛型就是指廣泛的、普通的類型。在java中是指把類型明確的工作推遲到創建對象或調用方法的時候才去明確的特殊的類型。
可一看一個簡單的例子:
Liststrings = new ArrayList (); strings.add("a String"); String aString = strings.get(0);
可以看到,通過菱形語法("<>")可以將List內元素的類型限定為String類型。
需要注意的是<>內的類型只能是引用類型,當然對于基本類型,可以使用對應的包裝類型。
(1)首先就像上面那個例子一樣,使用泛型能夠限定集合中,如List, Set中元素的類型,保證一個集合中只有一個類型。(這樣也就能夠使用增強for來遍歷集合)
(2)程序也能更加健壯(只要在編譯時期沒有出現警告,那么運行時期就不會出現ClassCastException異常)
(1)泛型類
泛型類也就是把泛型定義在類上,這樣用戶在使用類的時候才把類型給確定下來。
public class ObjectTool{ private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } }
可以看到上面這個程序,在使用時如果定義了類型,那么在使用時就可以不用進行強制類型轉換,直接就可以得到一個T類型的對象。
(2)泛型方法
有時候只關心某個方法,那么使用泛型時可以不定義泛型類,而是只定義一個泛型方法,如下
publicvoid show(T t) { System.out.println(t); }
需要注意一下定義的格式,泛型必須得先定義才能夠使用。
(3)繼承關系
泛型類在繼承時,可以明確父類(泛型類)的參數類型,也可以不明確。
現在我們有如下的泛型類
//泛型類
public interface Inter{ public abstract void show(T t); }
①明確類型
//在實現泛型類時明確父類的類型
public class InterImpl implements Inter{ @Override public void show(String s) { System.out.println(s); } }
②不明確類型
public class InterImpl(4)類型通配符implements Inter { @Override public void show(T t) { System.out.println(t); } }
(1)無界
類型通配符我感覺上和泛型方法差不多,只是不用在使用前進行定義,例子如下:
public void processElements(List> elements){ for(Object o : elements){ System.out.println(o); } }
"?"可以接收任何類型。
(2)上界
public void processElements(List extends A> elements){ for(A a : elements){ System.out.println(a.getValue()); } }
這種情況下能夠接收A類或者A類的子類。
(3)下界
public static void insertElements(List super A> list){ list.add(new A()); list.add(new B()); list.add(new C()); }
這種情況下能夠接收A類或者A類的父類
(4)類型通配符和泛型方法
我認為這兩種方式是差不多的,不過在使用時,如果參數之間是有依賴關系的,那么可以使用泛型方法,否則就使用類型通配符。(如果一個方法的返回值、某些參數的類型依賴另一個參數的類型就應該使用泛型方法,因為被依賴的類型如果是不確定的?,那么其他元素就無法依賴它)。
(5)開發相關
泛型通配符< ? extends T >來接收返回的數據,此寫法的泛型集合不能使用 add 方 法, 而< ? super T >不能使用 get 方法,做為接口調用賦值時易出錯。
這個怎么來理解呢,當我們使用extends時,我們可以讀元素,因為元素都是A類或子類,可以放心的用A類拿出。
當使用super時,可以添加元素,因為都是A類或父類,那么就可以安全的插入A類。
參考資料:https://segmentfault.com/a/11... 泛型就是這么簡單
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75040.html
摘要:引用泛型除了方法因不能使用外部實例參數外,其他繼承實現成員變量,成員方法,方法返回值等都可使用。因此,生成的字節碼僅包含普通的類,接口和方法。 為什么要使用泛型程序設計? 一般的類和方法,只能使用具體的類型:要么是基本類型,要么是自定義類的對應類型;如果要編寫可以應用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。----摘自原書Ordinary classes and meth...
摘要:知識點總結泛型知識點總結泛型泛型泛型就是參數化類型適用于多種數據類型執行相同的代碼泛型中的類型在使用時指定泛型歸根到底就是模版優點使用泛型時,在實際使用之前類型就已經確定了,不需要強制類型轉換。 Java知識點總結(Java泛型) @(Java知識點總結)[Java, Java泛型] [toc] 泛型 泛型就是參數化類型 適用于多種數據類型執行相同的代碼 泛型中的類型在使用時指定 泛...
摘要:靜態變量是被泛型類的所有實例所共享的。所以引用能完成泛型類型的檢查。對于這個類型系統,有如下的一些規則相同類型參數的泛型類的關系取決于泛型類自身的繼承體系結構。事實上,泛型類擴展都不合法。 前言 和C++以模板來實現靜多態不同,Java基于運行時支持選擇了泛型,兩者的實現原理大相庭徑。C++可以支持基本類型作為模板參數,Java卻只能接受類作為泛型參數;Java可以在泛型類的方法中取得...
摘要:泛型類在類的申明時指定參數,即構成了泛型類。換句話說,泛型類可以看成普通類的工廠。的作用就是指明泛型的具體類型,而類型的變量,可以用來創建泛型類的對象。只有聲明了的方法才是泛型方法,泛型類中的使用了泛型的成員方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一項新特性,它的本質是參數化類型(Parameterized Type)的應用,也就是說所操作的數據類型被指定為一個參數,...
摘要:可以看到,如果我們給泛型類制定了上限,泛型擦除之后就會被替換成類型的上限。相應的,泛型類中定義的方法的類型也是如此。參考語言類型擦除下界通配符和的區別 本篇博客主要介紹了Java類型擦除的定義,詳細的介紹了類型擦除在Java中所出現的場景。 1. 什么是類型擦除 為了讓你們快速的對類型擦除有一個印象,首先舉一個很簡單也很經典的例子。 // 指定泛型為String List list1 ...
閱讀 2815·2023-04-25 18:46
閱讀 706·2021-11-19 09:40
閱讀 2072·2021-09-28 09:36
閱讀 3378·2021-09-10 11:11
閱讀 3459·2019-08-30 15:55
閱讀 1800·2019-08-30 15:54
閱讀 2594·2019-08-29 16:16
閱讀 3541·2019-08-29 15:08