[英]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");
將調用該構造函數並強制A
為String
, E
為Integer
。
JLS 中有大量奇怪且令人困惑的構造,沒有人使用過。 因此,通讀 JLS 通常不是一個好主意,您會學到一些東西,但這是一種非常低效的學習方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.