簡體   English   中英

如果 Java 不支持參數化類型數組,那么 Arrays.asList() 如何使用它們?

[英]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.asListArrayList<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.

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