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)为什么会这样呢?
发布于 2010-01-16 03:13:13
当尝试将不正确类型的对象存储到数组中时,就会发生ArrayStoreException。
代码在做什么?
在给出的示例代码中,CollectionUtil.transform方法接受一个Collection并执行元素的就地转换,这意味着Objects被从原始的Collection (例如List)中取出,并返回到相同的Collection中。
Transformer的代码接受一个String并将其转换为一个Integer --这是这里的核心问题--在应用转换时对象的类型正在发生变化。
,怎么可能出问题了?
如前所述,CollectionUtil.transform将使用给定的Transformer并对Collection中的每个元素执行转换,并将其存储回原始Collection,即strList。
我怀疑由Arrays.asList创建的Arrays.asList是由一个String[]支持的,因为这可能是ArrayStoreException的来源。运行调试器确认了这一点,因为它是由一个String[5]支持的。(使用Eclipse,在Windows上运行在JRE 6上。)
这个例子说明了什么?
这是一个很好的例子,说明了泛型的缺乏允许编写非类型文件的代码,因此在运行时出现了一个问题。如果代码是用泛型编写的(而且支持它),这些类型的问题将在编译时捕捉到。
底线--不能转换List中的类型元素--如果List包含Strings,Transformer.transform应该只返回String。
能做些什么?
作为替代,谷歌馆藏有一个Collections2.transform方法,它接受给定的Collection并返回由Function转换的Collection。
该方法支持泛型,因此它是类型类型,并且它返回一个新的Collection意味着类型可以通过转换进行更改。
发布于 2014-04-19 16:11:57
Arrays.asList方法使用与新列表实例的支持数组相同的提供的数组。API代码如下所示:
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}对StringUtils.split的调用创建了一个传递给Arrays.asList方法的String[]。这将限制可以插入到新列表实例中的元素的类型仅限于String对象。
CollectionUtils类支持两种不同类型的转换:
transform()变体都属于这个类别。当使用由数组(例如ArrayList)支持的集合类型时,只有当转换的值与支持数组类型兼容时,转换才能成功。--这解释了您所看到的异常.collect()变体都属于第二类。重载版本的new ()方法要么接受输出集合作为参数,要么如果没有指定单独的集合,则创建一个新的list实例来收集转换的值。根据您要处理的场景,您应该使用第二种类型的转换,并调用collect()变体之一。
https://stackoverflow.com/questions/2075996
复制相似问题