成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 8新特性探究(6):泛型的目標類型推斷

開發 后端
以下是JEP101的特性內容了,Java作為靜態語言的代表者,可以說類型系統相當豐富。導致類型間互相轉換的問題困擾著每個java程序員,通過編譯器自動推斷類型的東西可以稍微緩解一下類型轉換太復雜的問題。

 

簡單理解泛型

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

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

  1. List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);   

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

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

泛型的尷尬

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

java7的泛型類型推斷改進

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

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

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

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

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

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

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

Java8的泛型類型推斷改進

java8里面泛型的目標類型推斷主要2個:

1.支持通過方法上下文推斷泛型目標類型

2.支持在方法調用鏈路當中,泛型類型推斷傳遞到***一個方法

讓我們看看官網的例子

  1. class List<E> {   
  2.    static <Z> List<Z> nil() { ... };   
  3.    static <Z> List<Z> cons(Z head, List<Z> tail) { ... };   
  4.    E head() { ... }   
  5. }   

根據JEP101的特性,我們在調用上面方法的時候可以這樣寫

  1. //通過方法賦值的目標參數來自動推斷泛型的類型   
  2. List<String> l = List.nil();   
  3. //而不是顯示的指定類型   
  4. //List<String> l = List.<String>nil();   
  5. //通過前面方法參數類型推斷泛型的類型   
  6. List.cons(42, List.nil());   
  7. //而不是顯示的指定類型   
  8. //List.cons(42, List.<Integer>nil());  

總結

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

原文鏈接:http://my.oschina.net/benhaile/blog/184390

責任編輯:林師授 來源: oschina
相關推薦

2014-07-15 14:48:26

Java8

2013-03-20 09:27:33

C#泛型

2014-04-15 09:53:54

Java8類型注解

2014-07-14 11:34:53

Java 8Nashorn

2014-04-16 07:43:31

Java 8JRE

2017-12-11 16:32:07

JavaJDK 10語言

2014-07-15 14:12:17

Java8

2014-04-15 15:45:22

Java8Java8教程

2014-10-20 13:57:59

JavaFX 8Java 8

2025-02-08 11:00:33

2014-07-15 13:57:53

Java8

2014-05-14 10:02:17

Java 8StampedLock

2014-04-16 07:48:56

Java 8Permgen

2024-12-30 11:05:28

泛型Go類型別名

2021-02-08 11:20:27

Java類型數組

2014-07-15 13:54:09

Java8

2014-03-25 10:20:37

Java 8新特性

2021-02-22 11:51:15

Java開發代碼

2014-07-15 15:01:01

Java8

2025-04-14 08:49:10

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲免费在线 | 欧美日韩成人影院 | 精品欧美一区二区三区久久久 | 精品国产一区二区在线 | 国产福利91精品 | 一区二区在线免费观看视频 | 国产成人精品午夜 | 免费成人在线网站 | 成人午夜精品 | 天堂在线免费视频 | 日日骚av | 国产欧美精品区一区二区三区 | 在线观看中文字幕 | 欧美理伦片在线播放 | 久久国内精品 | 日韩一三区 | 亚洲www啪成人一区二区麻豆 | 日韩三级在线 | 超碰97人人人人人蜜桃 | 一区二区三区精品在线视频 | 国产精品我不卡 | 中文字幕在线观看视频网站 | 一区二区在线 | 一区二区三区在线播放 | 日韩在线一区二区 | 日韩国产欧美在线观看 | 99精品免费久久久久久日本 | 欧美大片一区二区 | 在线成人免费视频 | 夜夜精品浪潮av一区二区三区 | 久久成人18免费网站 | 国产一区 在线视频 | 99久久精品免费看国产四区 | 国产精品高潮呻吟久久 | 日韩精品中文字幕在线 | 99在线观看| 欧美久久久久久久久中文字幕 | 亚洲精品观看 | 久久不卡区| 久久麻豆精品 | 在线2区|