[英]Convert list of strings to array of strings - difference between (String[])list.toArray() and list.toArray(new String[0])
[英]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.