Java8新特性之泛型的目標(biāo)類(lèi)型推斷_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
簡(jiǎn)單理解泛型
泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類(lèi)型,也就是說(shuō)所操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù)。通俗點(diǎn)將就是“類(lèi)型的變量”。這種類(lèi)型變量可以用在類(lèi)、接口和方法的創(chuàng)建中。
理解Java泛型最簡(jiǎn)單的方法是把它看成一種便捷語(yǔ)法,能節(jié)省你某些Java類(lèi)型轉(zhuǎn)換(casting)上的操作:
List<Apple> box = new ArrayList<Apple>(); box.add(new Apple());Apple apple =box.get(0);
上面的代碼自身已表達(dá)的很清楚:box是一個(gè)裝有Apple對(duì)象的List。get方法返回一個(gè)Apple對(duì)象實(shí)例,這個(gè)過(guò)程不需要進(jìn)行類(lèi)型轉(zhuǎn)換。沒(méi)有泛型,上面的代碼需要寫(xiě)成這樣:
Apple apple = (Apple)box.get(0);
泛型的尷尬
泛型的最大優(yōu)點(diǎn)是提供了程序的類(lèi)型安全同時(shí)可以向后兼容,但也有尷尬的地方,就是每次定義時(shí)都要寫(xiě)明泛型的類(lèi)型,這樣顯示指定不僅感覺(jué)有些冗長(zhǎng),最主要是很多程序員不熟悉泛型,因此很多時(shí)候不能夠給出正確的類(lèi)型參數(shù),現(xiàn)在通過(guò)編譯器自動(dòng)推斷泛型的參數(shù)類(lèi)型,能夠減少這樣的情況,并提高代碼可讀性。
java7的泛型類(lèi)型推斷改進(jìn)
在以前的版本中使用泛型類(lèi)型,需要在聲明并賦值的時(shí)候,兩側(cè)都加上泛型類(lèi)型。例如:
Map<String, String> myMap = new HashMap<String, String>();
你可能覺(jué)得:老子在聲明變量的的時(shí)候已經(jīng)指明了參數(shù)類(lèi)型,為毛還要在初始化對(duì)象時(shí)再指定?幸好,在Java SE 7中,這種方式得以改進(jìn),現(xiàn)在你可以使用如下語(yǔ)句進(jìn)行聲明并賦值:
Map<String, String> myMap = new HashMap<>(); //注意后面的"<>"
在這條語(yǔ)句中,編譯器會(huì)根據(jù)變量聲明時(shí)的泛型類(lèi)型自動(dòng)推斷出實(shí)例化HashMap時(shí)的泛型類(lèi)型。再次提醒一定要注意new HashMap后面的“<>”,只有加上這個(gè)“<>”才表示是自動(dòng)類(lèi)型推斷,否則就是非泛型類(lèi)型的HashMap,并且在使用編譯器編譯源代碼時(shí)會(huì)給出一個(gè)警告提示。
但是:Java SE 7在創(chuàng)建泛型實(shí)例時(shí)的類(lèi)型推斷是有限制的:只有構(gòu)造器的參數(shù)化類(lèi)型在上下文中被顯著的聲明了,才可以使用類(lèi)型推斷,否則不行。例如:下面的例子在java 7無(wú)法正確編譯(但現(xiàn)在在java8里面可以編譯,因?yàn)楦鶕?jù)方法參數(shù)來(lái)自動(dòng)推斷泛型的類(lèi)型):
List<String> list = new ArrayList<>(); list.add("A");// 由于addAll期望獲得Collection<? extends String>類(lèi)型的參數(shù),因此下面的語(yǔ)句無(wú)法通過(guò) list.addAll(new ArrayList<>());
Java8的泛型類(lèi)型推斷改進(jìn)
java8里面泛型的目標(biāo)類(lèi)型推斷主要2個(gè):
1.支持通過(guò)方法上下文推斷泛型目標(biāo)類(lèi)型
2.支持在方法調(diào)用鏈路當(dāng)中,泛型類(lèi)型推斷傳遞到最后一個(gè)方法
讓我們看看官網(wǎng)的例子
class List<E> { static <Z> List<Z> nil() { ... }; static <Z> List<Z> cons(Z head, List<Z> tail) { ... }; E head() { ... } }
根據(jù)JEP101的特性,我們?cè)谡{(diào)用上面方法的時(shí)候可以這樣寫(xiě)
//通過(guò)方法賦值的目標(biāo)參數(shù)來(lái)自動(dòng)推斷泛型的類(lèi)型 List<String> l = List.nil(); //而不是顯示的指定類(lèi)型 //List<String> l = List.<String>nil(); //通過(guò)前面方法參數(shù)類(lèi)型推斷泛型的類(lèi)型 List.cons(42, List.nil()); //而不是顯示的指定類(lèi)型 //List.cons(42, List.<Integer>nil());
總結(jié)
以上是JEP101的特性?xún)?nèi)容了,Java作為靜態(tài)語(yǔ)言的代表者,可以說(shuō)類(lèi)型系統(tǒng)相當(dāng)豐富。導(dǎo)致類(lèi)型間互相轉(zhuǎn)換的問(wèn)題困擾著每個(gè)java程序員,通過(guò)編譯器自動(dòng)推斷類(lèi)型的東西可以稍微緩解一下類(lèi)型轉(zhuǎn)換太復(fù)雜的問(wèn)題。 雖然說(shuō)是小進(jìn)步,但對(duì)于我們天天寫(xiě)代碼的程序員,肯定能帶來(lái)巨大的作用,至少心情更愉悅了~~說(shuō)不定在java 9里面,我們會(huì)得到一個(gè)通用的類(lèi)型var,像js或者scala的一些動(dòng)態(tài)語(yǔ)言那樣^(guān)_^
- Java8新特性之再見(jiàn)Permgen_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java8新特性之JavaFX 8_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java8新特性之lambda的作用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java8新特性之lambda(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
- 詳談Java8新特性泛型的類(lèi)型推導(dǎo)
- Java8新特性之重復(fù)注解(repeating annotations)淺析
- Java8新特性lambda表達(dá)式有什么用(用法實(shí)例)
- Java8新特性之Lambda表達(dá)式淺析
- JAVA8 十大新特性詳解
- Java新特性之Nashorn_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
相關(guān)文章
java 從int數(shù)組中獲取最大數(shù)的方法
這篇文章主要介紹了java 從int數(shù)組中獲取最大數(shù)的方法,需要的朋友可以參考下2017-02-02Jackson反序列化@JsonFormat 不生效的解決方案
這篇文章主要介紹了Jackson反序列化@JsonFormat 不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08關(guān)于jd-gui啟動(dòng)報(bào)This?program?requires?Java?1.8+的錯(cuò)誤問(wèn)題及解決方法
最近,在Mac使用上JD-GUI啟動(dòng)時(shí)總是報(bào)錯(cuò),接下來(lái)通過(guò)本文給大家介紹關(guān)于jd-gui啟動(dòng)報(bào)this?program?requires?Java?1.8+的錯(cuò)誤問(wèn)題及解決方法,需要的朋友可以參考下2022-05-05mybatisplus如何解決分頁(yè)最多500條數(shù)據(jù)
這篇文章主要介紹了mybatisplus如何解決分頁(yè)最多500條數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07多線(xiàn)程下嵌套異步任務(wù)導(dǎo)致程序假死問(wèn)題
這篇文章主要介紹了多線(xiàn)程下嵌套異步任務(wù)導(dǎo)致程序假死問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08IDEA Ultimate2020.2版本配置Tomcat詳細(xì)教程
這篇文章主要介紹了IDEA Ultimate2020.2版本配置Tomcat教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09