這個(gè)Java泛型不太正經(jīng)
一、前言
泛型在java中有很重要的地位,在實(shí)際開發(fā)中用處也很大。
二、泛型
泛型:是jdk5中引入的特性,他提供編譯是類型是類型的安全檢測機(jī)制,這個(gè)機(jī)制允許在編譯時(shí)檢測到非法的類型,它的本質(zhì)是參數(shù)化類型,也就是所操作的數(shù)據(jù)類型不變指定為一個(gè)參數(shù)
將原來具體的類型參數(shù)化,然后再使用/調(diào)用的時(shí)候傳入具體的參數(shù)
泛型的類型:
①:泛型類
②:泛型方法
③:泛型接口
三、泛型定義的格式:
<類型> :指定一種類型的格式,這里的類型可以看成是形參。
<類型1,類型2...>:指定多種類型的格式,多種類型之間用逗號隔開,這里的類型類型1,類型2可以看成是形參,將來具體調(diào)用的時(shí)候的參數(shù)看成是實(shí)參,這里的泛型只能是引用類型。
什么是引用類型?
除了八大基本類型其他的都是引用類型,如基本類型對應(yīng)的包裝類
- boolean -->Boolean
- char --->Character
- byte -->Byte
- short -->Short
- int -->Integer
- long -->Long
- float -->Float
- double -->Double
泛型的好處是:
- 把運(yùn)行得問題提前到編譯時(shí)期
- 避免了強(qiáng)制轉(zhuǎn)換
沒指定類型默認(rèn)是Object類型
舉個(gè)例子,當(dāng)沒有使用泛型時(shí):
import java.util.HashMap; import java.util.Map; import java.util.Set; public class 泛型Demo { public static void main(String[] args) { //創(chuàng)建一個(gè)對象 Map map=new HashMap(); //添加數(shù)據(jù) map.put(1, "張三"); map.put(2, "李四"); map.put(3,"王五"); map.put(5, 6);//加了不一樣的類型數(shù)據(jù) //鍵的集合 Set keySet=map.keySet(); //鍵找值 for(Object key: keySet){ String value=(String)map.get(key); System.out.println(key+":"+value); } } }
報(bào)了一個(gè)類型轉(zhuǎn)換異常(int會自動轉(zhuǎn)化成Integer),Integer不能轉(zhuǎn)為String
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
此時(shí)泛型的好處就體現(xiàn)出來了,將運(yùn)行時(shí)會出現(xiàn)的錯(cuò)誤拉到了編譯期間。
當(dāng)然也可以在輸出是采用Object接收
//鍵的集合 Set keySet=map.keySet(); //鍵找值 for(Object key: keySet){ Object value=map.get(key); // String value=(String)map.get(key); System.out.println(key+":"+value); }
這樣也可以得到想要的結(jié)果。
四、泛型類
泛型類的定義格式:
修飾符 class 類名<類型> { }
舉例:
public class Generic<T>{}
這里的T可以使任意標(biāo)識,常見的如T、E、K、V等形式常用于表示泛型。
泛型類下
public class Generic<T> { //定義一個(gè)變量,提供get set方法 private T t; public T getT(){ return t; } public void SetT(T t){ this.t=t; } }
測試類下
public class GenericDemo { public static void main(String[] args) { Generic<String> g1=new Generic<>(); g1.SetT("章三"); System.out.println(g1.getT()); System.out.println("------------------"); Generic<Integer> g2=new Generic<>(); g2.SetT(100); System.out.println(g2.getT()); } }
運(yùn)行結(jié)果
定義這個(gè)泛型類的好處就是可以在測試中輸入各種你想要的類型。
五、泛型方法
定義泛型方法的格式:
修飾符 <類型> 返回值類型 方法名 (類型 類型名)
舉例:
public <T> void show (T t){}
泛型方法
public class Generic { public <T> void show(T t){ System.out.println(t); } }
泛型方法測試下:
public class GenericDemo { public static void main(String[] args) { Generic g=new Generic(); g.show("張三"); g.show(100); g.show(true); g.show(null); } }
運(yùn)行結(jié)果
泛型方法比泛型類方便許多,直接在這使用即可,可以用個(gè)中類型的參數(shù)
六、泛型接口
格式:修飾符 interface 接口名<類型>{}
舉例:
public interface Generic<T>{}
既然是接口那就得定義一個(gè)類 去實(shí)現(xiàn)這個(gè)接口
泛型接口:
public interface Generic<T>{}
GenricImp類下:
public class GenricImp<T> Generic<T>{ public void show(T t){ System.out.println(t); } }
GenricDemo類下:
public class GenricDemo{ public static void main(String[]args){ Generic<String> g1=new GenericImp<String>(); g1.show("張三"); Generic<Integer> g2=new GenericImp<Integer>(); g2.show(100); } }
七、類型通配符
<? extends T>上限通配,?表示是T的一個(gè)未知子類。
<? super T>下限通配,?表示是T的一個(gè)未知父類。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
spring boot整合redis實(shí)現(xiàn)RedisTemplate三分鐘快速入門
這篇文章主要介紹了spring boot整合redis實(shí)現(xiàn)RedisTemplate三分鐘快速入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Java中常見的日期操作(取值、轉(zhuǎn)換、加減、比較)
本文給大家介紹java中常見的日期操作,日期取值、日期轉(zhuǎn)換、日期加減、日期比較,對java日期操作相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2015-12-12SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄
微信的登錄功能是用戶注冊和使用微信的必經(jīng)之路之一,而微信授權(quán)登錄更是方便了用戶的登錄操作,本文主要介紹了SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄,感興趣的可以了解一下2023-09-09