java - 使用 CollectionUtils 转换列表抛出 ArrayStoreException

标签 java collections apache-commons

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 创建的 ListString[] 支持,因为它很可能是 ArrayStoreException 的来源。运行调试器确认了这一点,因为它由 String[5] 支持。 (使用 Eclipse,在 Windows 上的 JRE 6 上运行。)

这个例子说明了什么?

这是一个典型的例子,说明缺少泛型如何允许编写类型不安全的代码,从而在运行时出现问题。如果代码是用泛型编写的(并且 Apache Commons Collection 支持它),这些类型的问题将在编译时被发现。

底线 -- 不能转换 List 中的类型元素 -- 如果 List 包含 StringTransformer.transform应该只返回一个 String

可以做什么?

作为替代方案,Google Collections有一个Collections2.transform方法,它采用给定的 Collection 并返回由 Function 转换的 Collection .

这个方法支持泛型,所以它是类型安全的,而且它返回一个新的 Collection 意味着类型可以通过转换来改变。

关于java - 使用 CollectionUtils 转换列表抛出 ArrayStoreException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2075996/

相关文章:

java - 如何计算列表中具有相同属性之一的自定义对象的数量

collections - Kotlin 进程收集并行?

java - Apache Commons Math 的标准偏差

Java Iterator 实现 - next() 和 hasNext() 执行顺序

java - 如何让 xmemcached 更快

Java + 正则表达式 : matching characters from a customized set that are not preceded by characters in the same set

arrays - Kotlin:泛型数组的泛型集合

java - 日志框架不兼容

java - 未指定 header 映射,无法按名称访问记录值(Apache Commons CSV)

java - 用于创建尚未定义的方法的 eclipse 快捷方式