本篇內(nèi)容主要講解“JAVA泛型通配符T,E,K,V有什么區(qū)別”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JAVA泛型通配符T,E,K,V有什么區(qū)別”吧!
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的萊州網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
1. 先解釋下泛型概念
泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。Java語言引入泛型的好處是安全簡單。
在Java SE 1.5之前,沒有泛型的情況的下,通過對類型Object的引用來實(shí)現(xiàn)參數(shù)的“任意化”,“任意化”帶來的缺點(diǎn)是要做顯式的強(qiáng)制類型轉(zhuǎn)換,而這種轉(zhuǎn)換是要求開發(fā)者對實(shí)際參數(shù)類型可以預(yù)知的情況下進(jìn)行的。對于強(qiáng)制類型轉(zhuǎn)換錯誤的情況,編譯器可能不提示錯誤,在運(yùn)行的時(shí)候才出現(xiàn)異常,這是一個安全隱患。
泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動和隱式的,以提高代碼的重用率。
舉個栗子:
Box類定義為一個泛型類
public class Box
創(chuàng)建一個Box對象,不帶泛型參數(shù),發(fā)現(xiàn)獲取對象的時(shí)候需要強(qiáng)制轉(zhuǎn)換
Box box2 = new Box();box2.set(new Apple());Apple apple = (Apple) box2.get();
創(chuàng)建一個Box對象,帶泛型參數(shù),獲取對象的時(shí)候就不需要強(qiáng)制轉(zhuǎn)換
Box
總結(jié)下泛型的好處就是
省去了強(qiáng)制轉(zhuǎn)換,可以在編譯時(shí)候檢查類型安全,可以用在類,方法,接口上
但是我們定義泛型類,泛型方法,泛型接口的時(shí)候經(jīng)常會碰見很多不同的通配符T,E,K,V等等,這些通配符又都是什么意思呢?繼續(xù)往下看
2. 下來說說泛型通配符T,E,K,V區(qū)別
這些全都屬于java泛型的通配符,剛開始我看到這么多通配符,一下暈了,這幾個其實(shí)沒什么區(qū)別,只不過是一個約定好的代碼,也就是說
使用大寫字母A,B,C,D......X,Y,Z定義的,就都是泛型,把T換成A也一樣,這里T只是名字上的意義而已
? 表示不確定的java類型 T (type) 表示具體的一個java類型 K V (key value) 分別代表java鍵值中的Key Value E (element) 代表Element
舉個栗子:
public class Test
和
public class Test { public List list = new ArrayList(); public static void main(String[] args) {Test
將T換成了A,在執(zhí)行效果上是沒有任何區(qū)別的,只不過我們約定好了T代表type,所以還是按照約定規(guī)范來比較好,增加了代碼的可讀性。
如果要定義多個泛型參數(shù),比如說兩個泛型參數(shù)很典型的一個栗子是Map的key,value泛型,我們也可以定義一個這樣的
public interface Mymap
下來就可以傳入任意類型,創(chuàng)建實(shí)例了,不用轉(zhuǎn)化類型
Mymap
如果要定義超過兩個,三個或三個以上的泛型參數(shù)可以使用T1, T2, ..., Tn,像這樣子
public class Test
3. 接下來說說List
ArrayList
ArrayList> al=new ArrayList>(); 集合元素可以是任意類型,這種沒有意義,一般是方法中,只是為了說明用法
ArrayList extends E> al=new ArrayList extends E>();
泛型的限定:
extends E:接收E類型或者E的子類型。
super E:接收E類型或者E的父類型
Object和T不同點(diǎn)在于,Object是一個實(shí)打?qū)嵉念?并沒有泛指誰,而T可以泛指Object,比方public void printList(List
下面舉個栗子比較下這三種:
package com.lyang.demo.fanxing;import java.util.Arrays;import java.util.List;/*** 測試泛型參數(shù)Object和T的區(qū)別* Created by yanglu on 2017/04/20.*/public class TestDifferenceBetweenObjectAndT {public static void printList1(List
4. 最后來說說T,Class
T是一種具體的類,例如String,List,Map......等等,這些都是屬于具體的類,這個比較好理解
Class是什么呢,Class也是一個類,但Class是存放上面String,List,Map......類信息的一個類,有點(diǎn)抽象,我們一步一步來看 。
如何獲取到Class類呢,有三種方式:
1. 調(diào)用Object類的getClass()方法來得到Class對象,這也是最常見的產(chǎn)生Class對象的方法。
例如:
List list = null;Class clazz = list.getClass();
2. 使用Class類的中靜態(tài)forName()方法獲得與字符串對應(yīng)的Class對象。
例如:
Class clazz = Class.forName("com.lyang.demo.fanxing.People");
3.獲取Class類型對象的第三個方法非常簡單。如果T是一個Java類型,那么T.class就代表了匹配的類對象。
Class clazz = List.class;
那么問題來了?Class類是創(chuàng)建出來了,但是Class
使用Class
People people = (People) Class.forName("com.lyang.demo.fanxing.People").newInstance();
看到了么,需要強(qiáng)轉(zhuǎn),如果反射的類型不是People類,就會報(bào)java.lang.ClassCastException錯誤。
使用Class
public class Test {public static
那Class
Class
Class>它是個通配泛型,?可以代表任何類型,主要用于聲明時(shí)的限制情況
例如可以聲明一個
public Class> clazz;
但是你不能聲明一個
public Class
因?yàn)門需要指定類型
所以當(dāng)不知道定聲明什么類型的Class的時(shí)候可以定義一個Class>,Class>可以用于參數(shù)類型定義,方法返回值定義等。
到此,相信大家對“JAVA泛型通配符T,E,K,V有什么區(qū)別”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!