簡體   English   中英

在 java 中,新關鍵字之后的 NonWildcardTypeArguments 的目的是什么?

[英]In java what is the purpose of NonWildcardTypeArguments following the new keyword?

我正在查看java 語言規范,並看到了這種編寫創建者的方式:

Creator:  
NonWildcardTypeArguments CreatedName ClassCreatorRest

在純代碼中:

new <Integer> String("1");
// or
new <String,Integer> Integer(5);
//or
new <Constructor,String,Integer> ArrayList<String>(5);

在每個示例中,據我所知,class 列表沒有用。 當新關鍵字之后的類型列表起作用時,你能給我一個例子嗎?

除非您遇到非常奇特的 java 類型變量構造函數的語法構造函數,否則此功能無效。 本質上,您永遠不應該這樣做。 它是為了語言的完整性,可能永遠不應該添加到 java 中。

您可以將類型參數定義放在類上,這是最常見的模式。 例如ArrayList有一個類型變量; 聲明如下:

class ArrayList<E> implements List<E> { ... }

第一個<E>聲明有一些沒有邊界的類型E 然后立即使用它(第一個<E>和第二個<E>看起來相同,但是一個聲明了 var 類型,另一個是 var 類型的用法,因此它們完全不同。到目前為止一切都很好。

但是您也可以直接在方法上聲明它們。 例如:

public static <E> coalesce(E... items) {
  for (E item : items) if (item != null) return item;
  return item;
}

可以使用盡可能多的 object 引用來調用此方法,並將返回第一個不是null的引用,並且調用的類型將是所有參數中的公分母。 換句話說,這將編譯:

String x = coalesce(null, someString, "defaultValue");

而如果我們寫了它:

public static Object coalesce(Object... items) {
  for (E item : items) if (item != null) return item;
  return item;
}

然后,雖然coalesce(null, someStringRef, "default")顯然必須返回一個String ,但編譯器不知道這一點,因此String x = coalesce(..)不會編譯。 你必須注入演員表。 generics 的重點是不必這樣做。

現在回答你的問題

構造函數也可以使用相同的功能(方法類型參數):

public class Example<T> {
  public <A> Example(A first, A second) {
  }
}

是合法的 java。 很難想出一個你想要構造函數 generics 的情況。 構造函數沒有返回類型,關鍵是 typeparam 只是構造函數需要,一旦你完成它就會停止所有相關性(如果它與實例本身相關,你會把它放在類型上,就像上面示例中的<E>一樣)。 因此,為什么您從未在 java 代碼中有效地看到它。 不過,如果您要編寫它,並且您不希望javac推斷 generics 而是想明確說明它,那么您正在閱讀的語法就是您將如何做到這一點:

new <String>Example<Integer>("a", "b");

將調用該構造函數並強制AStringEInteger

JLS 中有大量奇怪且令人困惑的構造,沒有人使用過。 因此,通讀 JLS 通常不是一個好主意,您會學到一些東西,但這是一種非常低效的學習方式。

暫無
暫無

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

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