编程语言
首页 > 编程语言> > java – 使用CollectionUtils转换List会抛出ArrayStoreException

java – 使用CollectionUtils转换List会抛出ArrayStoreException

作者:互联网

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并执行元素的就地变换,这意味着对象从原始Collection(例如List)中取出并放回到同一Collection中.

Transformer的代码采用String并将其转换为整数 – 这是核心问题 – 应用变换时对象的类型正在发生变化.

怎么可能出错?

如前所述,CollectionUtil.transform将使用给定的Transformer并对Collection中的每个元素执行转换,并将其存储回原始Collection,即strList.

我怀疑Arrays.asList创建的List由String []支持,因为它可能是ArrayStoreException的源.运行调试器确认,因为它由String [5]支持. (使用Eclipse,在Windows上运行JRE 6.)

这个例子说明了什么?

这是缺少泛型如何允许编写非类型安全的代码的一个主要示例,因此,在运行时出现问题.如果代码是用泛型编写的(并且Apache Commons Collection支持它),那么这些类型的问题将在编译时捕获.

底线 – 一个不能转换List中的类型元素 – 如果List包含字符串,Transformer.transform应该只返回一个String.

可以做些什么?

作为替代方案,Google Collections具有Collections2.transform方法,该方法获取给定的Collection并返回由Function转换的Collection.

此方法支持泛型,因此它是类型安全的,并且它返回新Collection的事实意味着类型可以通过转换进行更改.

标签:java,collections,apache-commons
来源: https://codeday.me/bug/20190827/1741908.html