我注意到下面的代碼在使用java spec 1.7在eclipse中編譯時工作,但在1.6中不起作用。爲什麼新的HashMap <>在JDK 1.6中產生錯誤,但不是1.7
HashMap<String, String> hashMap = new HashMap<>();
我想要一個解釋,但這種語法,爲什麼它適用於1.7。
我注意到下面的代碼在使用java spec 1.7在eclipse中編譯時工作,但在1.6中不起作用。爲什麼新的HashMap <>在JDK 1.6中產生錯誤,但不是1.7
HashMap<String, String> hashMap = new HashMap<>();
我想要一個解釋,但這種語法,爲什麼它適用於1.7。
的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
,這個泛型類的構造函數。
它使用的是在1.7中引入的diamond operator。
因爲它是JDK 1.7(鑽石運營商)的增強版,您必須對類的構造函數HashMap<String, String> hashMap = new HashMap<String, String>();
在Java SE 7中指定的泛型類型之前,您可以替換參數化類型一組空的類型參數(<>)的構造的:
Map<String, List<String>> myMap = new HashMap<>();
在Java SE 6它必須做這樣:
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
你不能使用你在JDK 1.7使用JDK 1.6
HTTP相同的語法://計算器。com/questions/16243541/arraylist-vs-arraylistinteger –
這個操作符有什麼意義? –
這是用於類型推斷,但同時告訴編譯器「嘿,這不是一個原始類型」。你可以在我鏈接的帖子中看到我的回答。 –