簡體   English   中英

是否需要在初始化Java中的泛型變量時弄清泛型參數?

[英]Is it required to clarify generic parameter on initialization of generic variable in java?

看,我們知道在編譯時,泛型類已轉換為原始形式,因此

List<String> a=new Arraylist<String>

實際上是相同的

List<String> a=new Arraylist<>

我對嗎? 是否確實需要在右側指定菱形內的類型?

您可能需要查看有關該主題的Oracle官方文檔

正如您所猜測的那樣,從Java 7開始,沒有必要指定類型,只要它可以由context明顯地推斷出來即可 引用最相關的部分:

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<>()); 

編輯: 有關類型推斷的更全面的Oracle教程 ,最新的Java 8增強功能。

從Java 7開始,您無需在實例化部分指定類型。 對於return語句也同樣適用。 它從返回類型隱式獲取。

我對嗎? 是否確實需要在右側指定菱形內的類型

首先,是的,如果您使用的是Java 1.6或更低版本,因為鑽石運算符不存在。


Java 7或更高版本不是必需的,它減少了冗長性,以便在必要時更好地注入類型(實例化,返回類型...)

從這篇文章

換句話說,JDK 7項目幣中添加了Diamond運算符, 為方法提供的構造函數帶來了類型推斷。

  • 使用方法時,如果不使用顯式參數類型說明,則將隱式完成類型推斷。
  • 另一方面,通過實例化,必須顯式指定菱形運算符以“告訴”編譯器以推斷類型。

<>稱為Diamond Operator Diamond運算符通過讓編譯器為泛型類的構造函數推斷參數類型,從而減少了Java泛型周圍的冗長程度。 換句話說,由於Java 7,沒有必要在菱形運算符內部指定類型。

請參閱: Java 7中Diamond運算符的意義是什么?

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

我們知道在編譯時,泛型類會轉換為原始形式

基本上是真的,這稱為類型擦除。

List<String> a=new Arraylist<String>對於List<String> a=new Arraylist<>實際上是相同的

從類型擦除的意義上講。 簡而言之,在編譯時,將List<String> a=new Arraylist<String>更改為List a=new Arraylist

您提出的示例是Java 7的一項新功能。您可以省略賦值右側的泛型參數,而只需使用所謂的“鑽石運算符”即可。 這就是您的陳述正確的地方。 在Java 7之前,您不能執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM