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