Java代码:
Transformer TRANSFORM_TO_INTEGER = new Transformer() {
public Object transform(Object input) {
Integer i = new Integer((String) input);
return i;
}
};
String begin = "1,2,3,4,5";
List strList = Arrays.asList(StringUtils.split(begin, ","));
CollectionUtils.transform(strList, TRANSFORM_TO_INTEGER);
这段代码会抛出 ArrayStoreException:
java.lang.ArrayStoreException
at java.util.Arrays$ArrayList.set(Arrays.java:2360)
at java.util.AbstractList$ListItr.set(AbstractList.java:488)
at org.apache.commons.collections.CollectionUtils.transform(CollectionUtils.java:434)
这是为什么?
最佳答案
ArrayStoreException
尝试将不正确类型的对象存储到数组中时发生。
代码在做什么?
在给出的示例代码中,CollectionUtil.transform
方法需要一个 Collection
并执行元素的就地转换,这意味着 Object
从原始 Collection
(例如 List
)中取出并放回相同的集合
。
Transformer
的代码获取一个 String
并将其转换为一个 Integer
-- 这是这里的核心问题 -- 应用转换时对象的类型正在改变 .
可能出了什么问题?
如前所述,CollectionUtil.transform
将使用给定的 Transformer
并对 Collection
中的每个元素执行转换并将其存储回去到原始 Collection
,即 strList
。
我怀疑 Arrays.asList
创建的 List
由 String[]
支持,因为它很可能是 ArrayStoreException
的来源。运行调试器确认了这一点,因为它由 String[5]
支持。 (使用 Eclipse,在 Windows 上的 JRE 6 上运行。)
这个例子说明了什么?
这是一个典型的例子,说明缺少泛型如何允许编写类型不安全的代码,从而在运行时出现问题。如果代码是用泛型编写的(并且 Apache Commons Collection 支持它),这些类型的问题将在编译时被发现。
底线 -- 不能转换 List
中的类型元素 -- 如果 List
包含 String
,Transformer.transform
应该只返回一个 String
。
可以做什么?
作为替代方案,Google Collections有一个Collections2.transform
方法,它采用给定的 Collection
并返回由 Function
转换的 Collection
.
这个方法支持泛型,所以它是类型安全的,而且它返回一个新的 Collection
意味着类型可以通过转换来改变。
关于java - 使用 CollectionUtils 转换列表抛出 ArrayStoreException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2075996/