2016-11-14 89 views
1

看,我們知道,在編譯泛型類轉化爲原始形式,所以是否需要澄清java中泛型變量初始化的泛型參數?

List<String> a=new Arraylist<String> 

實際上是相同的

List<String> a=new Arraylist<> 

是嗎?是否有任何情況需要在右側指定菱形內的類型?

+0

這取決於你正在使用的Java版本。在Java 7中,它是可選的。 – ScanQR

回答

0

您在這裏混合了一些東西了。

我們知道,在編譯泛型類轉化爲原始形式

基本屬實,這就是所謂的類型擦除。

List<String> a=new Arraylist<String> 是有效的 List<String> a=new Arraylist<>

在類型擦除感

不一樣的。簡單地說,在編譯時,List<String> a=new Arraylist<String>,「改變」,以List a=new Arraylist

你帶來了這個例子,是在Java 7中的一項新功能,您可以ommit的賦值UND只使用右手邊的泛型參數所謂的「鑽石操作員」。這是你的陳述成爲現實的地方。在Java 7之前,你不能這樣做。

+0

好的,如果編譯時,列表 a =新Arraylist ,被「改變」爲List a = new Arraylist 爲什麼不能執行 'a.add(new Exception(「dummy」))'? 在刪除類型之前檢查方法的正確性嗎? – SubZr0

+1

@ SubZr0正確。在編譯時,泛型類型用於這種檢查。在這些檢查之後執行類型擦除。 –

2

你可能想看看Oracle's official documentation on the topic

從你猜測的Java 7開始,沒有必要指定類型,只要它可以通過上下文明顯推斷出來即可。引用最相關的部分:

Java SE 7支持通用實例的有限類型推斷 創建;如果參數化類型 的構造函數在上下文中顯而易見,則只能使用類型推斷。例如, 下面的例子不能編譯:

List<String> list = new ArrayList<>(); list.add("A"); 

    // The following statement should fail since addAll expects 
    // Collection<? extends String> 

list.addAll(new ArrayList<>()); 

編輯:a more comprehensive Oracle tutorial on type inference,最新的Java 8的改進。

2

從Java 7開始,您不需要指定實例化部分的類型。對於返回語句也同樣適用。它隱含地從返回類型中獲取。

+0

>它隱含地從返回類型中獲取。 但它有關係嗎?所有可能的類型參數都有一個原始類型,而對象的行爲由引用類型設置。爲什麼需要? – SubZr0

1

對嗎?是否有任何情況下,確實需要在右側的鑽石內指定類型?

首先,是的,如果你使用java 1.6或更低,因爲鑽石操作員不存在。


的Java 7或更高版本,不necesary,但爲了更好的可讀性類型的注射,必要時(實例,返回類型...)

FROM THIS ARTICLE

減少冗長在其他單詞,JDK 7項目硬幣添加了一個鑽石操作員帶來了類型推理的構造函數已經可用的方法。

  • 隨着方法的類型推斷隱式完成,當一個人離開顯式參數類型規範。
  • 另一方面,通過實例化,必須明確指定菱形運算符以「告知」編譯器推斷該類型。
0

<>稱爲Diamond Operator。鑽石運算符通過讓編譯器推斷泛型類的構造函數的參數類型來減少一些Java周圍泛型的冗長度。換句話說,從Java 7開始,沒有必要在鑽石運算符中指定類型。

請參見:What is the point of the diamond operator in Java 7?