簡體   English   中英

java: (String[])List.toArray() 給出 ClassCastException

[英]java: (String[])List.toArray() gives ClassCastException

以下代碼(在 android 中運行)總是在第三行給我一個 ClassCastException:

final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();

當 v2 是 Object[0] 並且其中有字符串時也會發生這種情況。 任何想法為什么?

這是因為當你使用

 toArray() 

它返回一個 Object[],它不能轉換為 String[](即使內容是字符串)這是因為 toArray 方法只得到一個

List 

並不是

List<String>

因為泛型只是一個源代碼,在運行時不可用,所以它無法確定要創建什么類型的數組。

toArray(new String[v2.size()]);

分配正確類型的數組(String[] 和正確的大小)

您使用了錯誤的toArray()

請記住,Java 的泛型主要是語法糖。 ArrayList 實際上並不知道它的所有元素都是字符串。

要解決您的問題,請致電toArray(T[]) 在你的情況下,

String[] v3 = v2.toArray(new String[v2.size()]);

請注意,泛型形式toArray(T[])返回T[] ,因此不需要顯式轉換結果。

String[] v3 = v2.toArray(new String[0]); 

也可以解決問題,請注意,一旦為該方法提供了正確的 ArrayType,您甚至不需要再進行轉換。

String[] str = new String[list.size()];
str = (String[]) list.toArray(str);

像這樣使用。

使用JDK 11 Stream API 中的toArray ,您可以通過以下方式解決更一般的問題:

Object[] v1 = new String[] {"a", "b", "c"}; // or array of another type
String[] v2 = Arrays.stream(v1)
    .<String>map((Object v) -> v.toString()).toArray(String[]::new);

暫無
暫無

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

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