2013-05-17 72 views
8

我注意到下面的代碼在使用java spec 1.7在eclipse中編譯時工作,但在1.6中不起作用。爲什麼新的HashMap <>在JDK 1.6中產生錯誤,但不是1.7

HashMap<String, String> hashMap = new HashMap<>(); 

我想要一個解釋,但這種語法,爲什麼它適用於1.7。

+2

HTTP相同的語法://計算器。com/questions/16243541/arraylist-vs-arraylistinteger –

+0

這個操作符有什麼意義? –

+0

這是用於類型推斷,但同時告訴編譯器「嘿,這不是一個原始類型」。你可以在我鏈接的帖子中看到我的回答。 –

回答

19

new HashMap<>()(稱爲鑽石語法)未在JDK 1.6允許的,只是因爲它是在Java SE 7

查找範圍Highlights of Technology Changes in Java SE 7介紹僅供Type Inference for Generic Instance Creation

我想要一個解釋,但這種語法,爲什麼它適用於1.7。

下面是Oracle itself這種解釋(稍作改動):Java SE的從之前版本的

編譯器,以7能夠推斷出通用的構造,類似於通用方法的實際類型參數。但是,如果您使用菱形(<>),Java SE 7中的編譯器可以推斷實例化泛型類的實際類型參數。請看下面的例子,這是有效的Java SE 7和更高版本:

class MyClass<X> { 
    <T> MyClass(T t) { 
    // ... 
    } 
} 

 

MyClass<Integer> myObject = new MyClass<>(""); 

在這個例子中,編譯器推斷的爲正式類型類型Integer參數X,通用類MyClass<X>。它推斷類型String爲正式類型參數,T,這個泛型類的構造函數。

4

因爲它是JDK 1.7(鑽石運營商)的增強版,您必須對類的構造函數HashMap<String, String> hashMap = new HashMap<String, String>();

9

在Java SE 7中指定的泛型類型之前,您可以替換參數化類型一組空的類型參數(<>)的構造的:

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

在Java SE 6它必須做這樣:

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

More details...

1

你不能使用你在JDK 1.7使用JDK 1.6

相關問題