一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java8中對泛型目標(biāo)類型推斷方法的改進(jìn)

Java8中對泛型目標(biāo)類型推斷方法的改進(jìn)

2019-11-23 17:30Java教程網(wǎng) JAVA教程

這篇文章主要介紹了Java8中對泛型目標(biāo)類型推斷方法的改進(jìn),需要的朋友可以參考下

一、簡單理解泛型

泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。通俗點將就是“類型的變量”。這種類型變量可以用在類、接口和方法的創(chuàng)建中。

理解Java泛型最簡單的方法是把它看成一種便捷語法,能節(jié)省你某些Java類型轉(zhuǎn)換(casting)上的操作:

復(fù)制代碼代碼如下:
List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);


上面的代碼自身已表達(dá)的很清楚:box是一個裝有Apple對象的List。get方法返回一個Apple對象實例,這個過程不需要進(jìn)行類型轉(zhuǎn)換。沒有泛型,上面的代碼需要寫成這樣:

復(fù)制代碼代碼如下:
Apple apple = (Apple)box.get(0);

 

二、泛型的尷尬

泛型的最大優(yōu)點是提供了程序的類型安全同時可以向后兼容,但也有尷尬的地方,就是每次定義時都要寫明泛型的類型,這樣顯示指定不僅感覺有些冗長,最主要是很多程序員不熟悉泛型,因此很多時候不能夠給出正確的類型參數(shù),現(xiàn)在通過編譯器自動推斷泛型的參數(shù)類型,能夠減少這樣的情況,并提高代碼可讀性。


三、java7的泛型類型推斷改進(jìn)

在以前的版本中使用泛型類型,需要在聲明并賦值的時候,兩側(cè)都加上泛型類型。例如:

復(fù)制代碼代碼如下:
Map<String, String> myMap = new HashMap<String, String>();


你可能覺得:老子在聲明變量的的時候已經(jīng)指明了參數(shù)類型,為毛還要在初始化對象時再指定?幸好,在Java SE 7中,這種方式得以改進(jìn),現(xiàn)在你可以使用如下語句進(jìn)行聲明并賦值:

復(fù)制代碼代碼如下:
Map<String, String> myMap = new HashMap<>(); //注意后面的"<>"

 

在這條語句中,編譯器會根據(jù)變量聲明時的泛型類型自動推斷出實例化HashMap時的泛型類型。再次提醒一定要注意new HashMap后面的“<>”,只有加上這個“<>”才表示是自動類型推斷,否則就是非泛型類型的HashMap,并且在使用編譯器編譯源代碼時會給出一個警告提示。

但是:Java SE 7在創(chuàng)建泛型實例時的類型推斷是有限制的:只有構(gòu)造器的參數(shù)化類型在上下文中被顯著的聲明了,才可以使用類型推斷,否則不行。例如:下面的例子在java 7無法正確編譯(但現(xiàn)在在java8里面可以編譯,因為根據(jù)方法參數(shù)來自動推斷泛型的類型):

 

復(fù)制代碼代碼如下:

List<String> list = new ArrayList<>();
list.add("A");// 由于addAll期望獲得Collection<? extends String>類型的參數(shù),因此下面的語句無法通過
list.addAll(new ArrayList<>());

 


四、Java8的泛型類型推斷改進(jìn)

java8里面泛型的目標(biāo)類型推斷主要2個:

1.支持通過方法上下文推斷泛型目標(biāo)類型
2.支持在方法調(diào)用鏈路當(dāng)中,泛型類型推斷傳遞到最后一個方法
讓我們看看官網(wǎng)的例子:

復(fù)制代碼代碼如下:

class List<E> {
   static <Z> List<Z> nil() { ... };
   static <Z> List<Z> cons(Z head, List<Z> tail) { ... };
   E head() { ... }
}


 根據(jù)JEP101的特性,我們在調(diào)用上面方法的時候可以這樣寫

 

 

復(fù)制代碼代碼如下:

//通過方法賦值的目標(biāo)參數(shù)來自動推斷泛型的類型
List<String> l = List.nil();
//而不是顯示的指定類型
//List<String> l = List.<String>nil();
//通過前面方法參數(shù)類型推斷泛型的類型
List.cons(42, List.nil());
//而不是顯示的指定類型
//List.cons(42, List.<Integer>nil());

 

五、總結(jié)

以上是JEP101的特性內(nèi)容了,Java作為靜態(tài)語言的代表者,可以說類型系統(tǒng)相當(dāng)豐富。導(dǎo)致類型間互相轉(zhuǎn)換的問題困擾著每個java程序員,通過編譯器自動推斷類型的東西可以稍微緩解一下類型轉(zhuǎn)換太復(fù)雜的問題。 雖然說是小進(jìn)步,但對于我們天天寫代碼的程序員,肯定能帶來巨大的作用,至少心情更愉悅了~~說不定在java 9里面,我們會得到一個通用的類型var,像js或者scala的一些動態(tài)語言那樣^_^

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久亚洲精选 | 色综合久久中文字幕综合网 | 国产精品igao视频网网址 | 午夜欧美精品久久久久久久 | 啊用力好大粗黑人小说 | 亚瑟天堂久久一区二区影院 | 亚洲精品无码久久不卡 | 久久久无码精品亚洲欧美 | 高清欧美不卡一区二区三区 | 百合互慰吃奶互揉漫画 | 99久久中文字幕伊人 | 国产裸露片段精华合集链接 | 日本在线观看www鲁啊鲁视频 | 久久国产精品永久免费网站 | 色多多多 | 国产99精品成人免费视频 | 国产精品午夜国产小视频 | 爱福利视频一区二区 | 国产一区二区视频在线播放 | 欧美一级乱妇老太婆特黄 | 日本卡一卡2卡3卡4精品卡无人区 | 男人天堂bt | 亚洲精品一区二区三区在线观看 | 91精品国产品国语在线不卡 | 天堂在线免费观看 | 天天插在线视频 | 日本漫画工囗全彩内番e绅 日本伦理动漫在线观看 | 亚洲人成综合在线播放 | 草草草在线 | 欧美影院一区二区 | 免费黄色网站视频 | 亚洲 欧美 国产 综合久久 | 91视频免费观看网站 | 亚洲 日韩经典 中文字幕 | 日本一区二区免费在线观看 | 日本噜噜影院 | 美女扒开屁股 | fuqer日本 | 温柔校草高h | 经典三级四虎在线观看 | 操闺蜜 |