首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CollectionUtils抛出ArrayStoreException转换列表

使用CollectionUtils抛出ArrayStoreException转换列表
EN

Stack Overflow用户
提问于 2010-01-16 02:39:48
回答 2查看 9.2K关注 0票数 3

Java代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)

为什么会这样呢?

EN

回答 2

Stack Overflow用户

发布于 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意味着类型可以通过转换进行更改。

票数 5
EN

Stack Overflow用户

发布于 2014-04-19 16:11:57

Arrays.asList方法使用与新列表实例的支持数组相同的提供的数组。API代码如下所示:

代码语言:javascript
复制
public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}

StringUtils.split的调用创建了一个传递给Arrays.asList方法的String[]。这将限制可以插入到新列表实例中的元素的类型仅限于String对象。

CollectionUtils类支持两种不同类型的转换:

  1. 就地转换--在本例中,输入集合实例将使用转换后的值进行更新。所有的transform()变体都属于这个类别。当使用由数组(例如ArrayList)支持的集合类型时,只有当转换的值与支持数组类型兼容时,转换才能成功。--这解释了您所看到的异常.
  2. 失地转换--在这种情况下,输入集合从未更新过。相反,转换后的值将在单独的集合实例中收集。所有的collect()变体都属于第二类。重载版本的new ()方法要么接受输出集合作为参数,要么如果没有指定单独的集合,则创建一个新的list实例来收集转换的值。

根据您要处理的场景,您应该使用第二种类型的转换,并调用collect()变体之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2075996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档