最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8新特性之泛型的目標(biāo)類型推斷_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年06月07日 15:50:19   投稿:mrr  
泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。下面通過本文給分享Java8新特性之泛型的目標(biāo)類型推斷,感興趣的朋友參考下吧

簡(jiǎn)單理解泛型

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

理解Java泛型最簡(jiǎn)單的方法是把它看成一種便捷語法,能節(jié)省你某些Java類型轉(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è)過程不需要進(jìn)行類型轉(zhuǎn)換。沒有泛型,上面的代碼需要寫成這樣:

Apple apple = (Apple)box.get(0);

泛型的尷尬

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

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

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

Map<String, String> myMap = new HashMap<String, String>();

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

Map<String, String> myMap = new HashMap<>(); //注意后面的"<>"

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

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

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

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

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

1.支持通過方法上下文推斷泛型目標(biāo)類型

2.支持在方法調(diào)用鏈路當(dāng)中,泛型類型推斷傳遞到最后一個(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í)候可以這樣寫

//通過方法賦值的目標(biāo)參數(shù)來自動(dòng)推斷泛型的類型
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)換的問題困擾著每個(gè)java程序員,通過編譯器自動(dòng)推斷類型的東西可以稍微緩解一下類型轉(zhuǎn)換太復(fù)雜的問題。 雖然說是小進(jìn)步,但對(duì)于我們天天寫代碼的程序員,肯定能帶來巨大的作用,至少心情更愉悅了~~說不定在java 9里面,我們會(huì)得到一個(gè)通用的類型var,像js或者scala的一些動(dòng)態(tài)語言那樣^_^

相關(guān)文章

  • 關(guān)于SpingMVC的<context:component-scan>包掃描踩坑記錄

    關(guān)于SpingMVC的<context:component-scan>包掃描踩坑記錄

    這篇文章主要介紹了關(guān)于SpingMVC的<context:component-scan>包掃描踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring中的注解@Value("#{}")與@Value("${}")的區(qū)別介紹

    Spring中的注解@Value("#{}")與@Value("${}")的區(qū)別

    這篇文章主要介紹了Spring中的注解@Value(“#{}“)與@Value(“${}“)的區(qū)別到底是什么,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 詳解SpringCloud-OpenFeign組件的使用

    詳解SpringCloud-OpenFeign組件的使用

    這篇文章主要介紹了SpringCloud-OpenFeign組件的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • java自加和自減運(yùn)算過程

    java自加和自減運(yùn)算過程

    這篇文章主要介紹了java自加和自減運(yùn)算過程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • Java實(shí)戰(zhàn)之用hutool-db實(shí)現(xiàn)多數(shù)據(jù)源配置

    Java實(shí)戰(zhàn)之用hutool-db實(shí)現(xiàn)多數(shù)據(jù)源配置

    在微服務(wù)搭建中經(jīng)常會(huì)使用到多數(shù)據(jù)庫情形這個(gè)時(shí)候,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)戰(zhàn)之用hutool-db實(shí)現(xiàn)多數(shù)據(jù)源配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 淺談java object對(duì)象在heap中的結(jié)構(gòu)

    淺談java object對(duì)象在heap中的結(jié)構(gòu)

    本文主要介紹了淺談java object對(duì)象在heap中的結(jié)構(gòu),感興趣的同學(xué),可以參考下。
    2021-06-06
  • SpringMVC?處理后端日期格式的示例詳解

    SpringMVC?處理后端日期格式的示例詳解

    在WebMvcConfiguration中擴(kuò)展SpringMVC的消息轉(zhuǎn)換器,統(tǒng)一對(duì)日期類型進(jìn)行格式處理,本文給大家介紹SpringMVC處理后端日期格式,感興趣的朋友一起看看吧
    2023-11-11
  • Spring事務(wù)原理解析

    Spring事務(wù)原理解析

    Spring事務(wù)有可能會(huì)提交,回滾、掛起、恢復(fù),所以Spring事務(wù)提供了一種機(jī)制,可以讓程序員來監(jiān)聽當(dāng)前Spring事務(wù)所處于的狀態(tài),這篇文章主要介紹了Spring底層事務(wù)原理,需要的朋友可以參考下
    2022-12-12
  • java字符串所有操作方法匯總

    java字符串所有操作方法匯總

    這篇文章主要介紹了java字符串所有操作方法匯總,需要的朋友可以參考下,在實(shí)際的編程中,我們經(jīng)常需要對(duì)字符串進(jìn)行各種操作,例如連接、截取、替換等,本文將按類別介紹一些Java字符串的常用方法,幫助讀者更好地理解和使用
    2023-11-11
  • SpringBoot中如何打印Http請(qǐng)求日志

    SpringBoot中如何打印Http請(qǐng)求日志

    所有針對(duì)第三方的請(qǐng)求都強(qiáng)烈推薦打印請(qǐng)求日志,本文主要介紹了SpringBoot中如何打印Http請(qǐng)求日志,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06

最新評(píng)論

灌云县| 成都市| 瓦房店市| 淮南市| 乌鲁木齐县| 青州市| 东阳市| 广安市| 伊宁县| 门源| 宁都县| 孝感市| 江油市| 昭通市| 图木舒克市| 崇左市| 丰都县| 河南省| 林甸县| 钟祥市| 包头市| 香格里拉县| 宁陕县| 保靖县| 无锡市| 香河县| 卢龙县| 龙游县| 金溪县| 浦江县| 宜宾市| 莎车县| 华安县| 神池县| 昭平县| 沽源县| 株洲市| 葫芦岛市| 苍梧县| 手游| 故城县|