[英]If Java doesn't support parameterized type arrays, how does Arrays.asList() work with them?
據說,方法Arrays.asList
看起來像這樣:
public static <T> List<T> asList(T... a)
T...
實際上等同於T[]
,但是在 Java 中不是不允許使用泛型類型的數組嗎? 例如:
// Example 1
ArrayList<Integer>[] list = new ArrayList<Integer>[10]; // This is not allowed
// Example 2
List<ArrayList<Integer> > listOfList = Arrays.asList(new ArrayList<Integer>(), new ArrayList<Integer>()); // Allowed?
在示例 2 中,我傳遞的兩個參數意味着Arrays.asList
將ArrayList<Integer>[]
作為與示例 1 相矛盾的參數。為什么示例 2 工作而示例 1 不起作用?
您可以在 Java 中聲明泛型類型數組,這是完全合法的。 所以這應該有效。
private E[] array;
但是你不能像這樣實例化一個泛型數組,因為數組是具體化的,並且所有的泛型類型都被實現為擦除。 所以這個虛構的E
在運行時不可用,你運氣不好!
array = new E[10]; // Illegal and gives compiler error.
但是你在這里有一個解決方法。 你能做的只是演員表。
array = (E[]) new Object[10];
通過這種方式,您可以在 java 中創建和實例化一個通用數組。 您可以在盡可能低的級別使用@SuppressWarnings("unchecked")
,可以在聲明的位置擺脫編譯器發出的任何未經檢查的警告。
在這里, T[]
在參數聲明中,正如@Ravindra Ranwala 所回答的那樣,聲明T[]
類型的變量或參數是完全沒問題的。 它正在創建一個類型參數類型的數組,即不允許的new T[]
。
在這種情況下,通過傳遞給 varargs 參數,編譯器實際上隱式地創建了一個ArrayList<Integer>[]
類型的ArrayList<Integer>[]
來傳遞給方法。 如您所知,也不允許創建參數化類型的數組,即new ArrayList<Integer>[]
。 因此編譯器會創建new ArrayList[]
,並且通常情況下,您會在這樣的調用中收到警告。 但是,你不要在此調用得到一個警告,因為Arrays.asList()
有@SafeVarargs
注解,這表明他們不使用運行時組件類型的數組對象,因此它是安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.