当我尝试进行转换时,我遇到了异常
java.lang.ArrayStoreException: java.util.HashSet
at java.util.AbstractCollection.toArray(Unknown Source)
这是我的代码
Map<String, Set<String>> map = new HashMap<>();
String[] keySet = map.keySet().toArray(new String[map.size()]);
Collection<Set<String>> collections = map.values();
String[] values = collection.toArray(new String[collection.size()]);// In this line getting Exception
答案 0 :(得分:2)
您无法执行的操作。在文档中对此进行了明确说明。
toArray
方法被记录为抛出java.lang.ArrayStoreException
:
如果指定数组的运行时类型不是该数组的超类型 该集合中每个元素的运行时类型
相反,您可以做的是根据地图值flatMap创建一个流! (即折叠嵌套序列),然后收集到一个数组中:
map.values() // Collection<Set<String>>
.stream() // Stream<Set<String>>
.flatMap(Collection::stream) // Stream<String>
.toArray(String[]::new); // String[]
答案 1 :(得分:1)
在values
上流式传输时,您可以简单地使用Stream.flatMap
以便稍后将它们收集到数组中。可以这样做:
String[] values = map.values().stream()
.flatMap(Collection::stream)
.toArray(String[]::new);
注意 :即使使用
,代码也能成功编译的原因toArray(new String[collection.size()])
是Collection.toArray(T[] a)
,因为编译器很难在执行通用类型之前确定类型。这就是为什么
Integer[] values = collections.toArray(new Integer[collections.size()]);
将根据您的情况进行编译,但是现在您可以清楚地看到,集合中的任何地方都没有Integer
类型。因此,在 runtime 处,将使用指定数组的运行时类型和此集合的大小为分配一个新数组。
因为您的集合的类型为ArrayStoreException
而不是Set<String>
,所以您的情况下String
就是从那里产生类型不匹配的。
重要 :您可能无法像进一步想像的那样convert to a generic array。