Java中泛型的使用和優(yōu)點(diǎn)解析
1. 泛型概述
什么是泛型,為什么要用泛型?
泛型,即“參數(shù)化類型”。一提到參數(shù),最熟悉的就是定義方法時(shí)有形參,然后調(diào)用此方法時(shí)傳遞實(shí)參。那么參數(shù)化類型怎么理解呢?顧名思義,就是將類型由原來的具體的類型參數(shù)化,類似于方法中的變量參數(shù),此時(shí)類型也定義成參數(shù)形式(可以稱之為類型形參),然后在使用/調(diào)用時(shí)傳入具體的類型(類型實(shí)參)。
泛型的本質(zhì)是為了參數(shù)化類型(在不創(chuàng)建新的類型的情況下,通過泛型指定的不同類型來控制形參具體限制的類型)。也就是說在泛型使用過程中,操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。
2. 泛型舉例
List arrayList = new ArrayList(); arrayList.add("aaaa"); arrayList.add(100); for(int i = 0; i< arrayList.size();i++){ String item = (String)arrayList.get(i); }
這段代碼是不能執(zhí)行的,原因也很簡(jiǎn)單,100并不是字符串,無法強(qiáng)轉(zhuǎn)輸出,那如何避免這中問題呢?答案很簡(jiǎn)單,采用 泛型 。
List arrayList = new ArrayList<String>();
這樣的話,我們的arrayList中就只能存儲(chǔ)String類型的數(shù)據(jù)。
3. 泛型的優(yōu)點(diǎn)
- 編譯時(shí),檢查添加元素的類型,提高了安全性。
- 減少了類型轉(zhuǎn)換的次數(shù),提高效率。
- 不再提示編譯警告
4. 泛型介紹
- 泛型又稱參數(shù)化類型,是jdk5.0出現(xiàn)的新特性,解決數(shù)據(jù)類型的安全性問題。
- 在類聲明或?qū)嵗瘯r(shí)只要指定好需要的具體的類型即可。
- Java泛型可以保證如果程序在編譯時(shí)沒有發(fā)出警告,運(yùn)行時(shí)就不會(huì)產(chǎn)生ClassCastException 異常,同時(shí)代碼更加簡(jiǎn)潔,健壯。
- 泛型的作用是:可以在類聲明時(shí)通過一個(gè)標(biāo)識(shí)表示類中某個(gè)屬性的類型,或者是某個(gè)方法的返回值的類型,或者是參數(shù)類型。
5. 泛型的語法
interface 接口<T>{ } 和 class 類<k,v>{ }
說明
- 其中,T,K,V不代表值,而是表示類型。
- 任意字母都可以。常用T表示,是Type的縮寫。
6. 泛型使用
6.1 簡(jiǎn)單了解
class Person<E> { E s ;//E 表示 s 的數(shù)據(jù)類型, 該數(shù)據(jù)類型在定義 Person 對(duì)象的時(shí)候指定,即在編譯期間,就確定 E 是什么類型 public Person(E s) { //E 也可以是參數(shù)類型 this.s = s; } public E f() { //返回類型使用 E return s; } public void show() { System.out.println(s.getClass());//顯示 s 的運(yùn)行類型 } }
我們實(shí)例化一個(gè)Person對(duì)象
Person person = new Person(“要開學(xué)了”);
對(duì)比下面理解
class Person { String s ;//E 表示 s 的數(shù)據(jù)類型, 該數(shù)據(jù)類型在定義 Person 對(duì)象的時(shí)候指定,即在編譯期間,就確定 E是什么類型 public Person(String s) { //E 也可以是參數(shù)類型 this.s = s; } public String f() { //返回類型使用 E return s; } }
6.2 進(jìn)一步了解
泛型的實(shí)例化
要在類名后面指定類型參數(shù)的值(類型)例如:
List<String> list = new ArrayList<String>(); Iterator<Customer> iterator = customer.iterator();
實(shí)例化舉例
使用泛型方式給 HashSet 放入 3 個(gè)學(xué)生對(duì)象
HashSet<Student> students = new HashSet<Student>(); students.add(new Student("jack", 18)); students.add(new Student("tom", 28)); students.add(new Student("mary", 19)); //遍歷 for (Student student : students) { System.out.println(student); }
使用泛型方式給 HashMap 放入 3 個(gè)學(xué)生對(duì)象
//使用泛型方式給 HashMap 放入 3 個(gè)學(xué)生對(duì)象 //K -> String V->Student HashMap<String, Student> hm = new HashMap<String, Student>(); /* public class HashMap<K,V> {} */ hm.put("lucy", new Student("lucy", 38)); hm.put("smith", new Student("smith", 48)); hm.put("jack", new Student("jack", 28));
6.3 泛型接口
泛型接口的使用與泛型的定義及使用基本相同
//定義一個(gè)泛型接口 public interface Generator<T> { public T next(); }
未傳參時(shí)
/** * 未傳入泛型實(shí)參時(shí),與泛型類的定義相同,在聲明類的時(shí)候,需將泛型的聲明也一起加到類中 * 即:class FruitGenerator<T> implements Generator<T>{ * 如果不聲明泛型,如:class FruitGenerator implements Generator<T>,編譯器會(huì)報(bào)錯(cuò):"Unknown class" */ class FruitGenerator<T> implements Generator<T>{ @Override public T next() { return null; } }
傳參后
/** * 傳入泛型實(shí)參時(shí): * 定義一個(gè)生產(chǎn)器實(shí)現(xiàn)這個(gè)接口,雖然我們只創(chuàng)建了一個(gè)泛型接口Generator<T> * 但是我們可以為T傳入無數(shù)個(gè)實(shí)參,形成無數(shù)種類型的Generator接口。 * 在實(shí)現(xiàn)類實(shí)現(xiàn)泛型接口時(shí),如已將泛型類型傳入實(shí)參類型,則所有使用泛型的地方都要替換成傳入的實(shí)參類型 * 即:Generator<T>,public T next();中的的T都要替換成傳入的String類型。 */ public class FruitGenerator implements Generator<String> { private String[] fruits = new String[]{ "Apple", "Banana", "Pear"}; @Override public String next() { return fruits[1]; } }
7. 泛型使用的注意事項(xiàng)
- interface List{},public class HashSet{} 等等
其中T,E只能是引用類型,主要就是int等類型要使用其包裝類例如:
List list = new ArrayList() //正確 List list = new ArrayList() //錯(cuò)誤,int不是引用類型。
在給泛型指定具體類型后,可以傳入該類型或者其子類型。
泛型使用形式
List list1 = new ArrayList(); List list2 = new ArrayList<>();?注意,后面的泛型可以省略 List list3 = new ArrayList();
如果我們這么寫,默認(rèn)給他的泛型是Object類型
8. 結(jié)語
泛型在Java開發(fā)中非常常用,就如集合般,他倆常常是一起使用的,注意語法即可,后面寫小項(xiàng)目時(shí)自己就會(huì)用了,不需要直接就理解,后面的學(xué)習(xí)中會(huì)經(jīng)??匆?,再回過頭看你會(huì)發(fā)現(xiàn),泛型也就這么回事。
到此這篇關(guān)于Java中泛型的使用和優(yōu)點(diǎn)解析的文章就介紹到這了,更多相關(guān)Java的泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Maven打包時(shí)包含資源文件和源碼到j(luò)ar的方法
這篇文章主要介紹了使用Maven打包時(shí)包含資源文件和源碼到j(luò)ar的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

MP(MyBatis-Plus)實(shí)現(xiàn)樂觀鎖更新功能的示例代碼

spring boot 3.3.0和mybatis plus 3.5.6版本沖突

Java中Map循環(huán)遍歷的五種方法實(shí)現(xiàn)

java理論基礎(chǔ)Stream管道流狀態(tài)與并行操作

springboot shardingjdbc與druid數(shù)據(jù)源沖突問題及解決