3

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)

何故ですか?

4

2 に答える 2

5

これArrayStoreExceptionは、不適切な型のオブジェクトを配列に格納しようとしたときに発生します。

コードは何をしていますか?

与えられたコード例では、CollectionUtil.transformメソッドは を受け取りCollection、要素のインプレース変換を実行します。つまりObject、元の から が取り出されCollection( などList)、同じ に戻されCollectionます。

のコードは をTransformer受け取り、Stringそれを に変換します。Integerこれはここでの核となる問題です。変換が適用されると、オブジェクトのタイプが変化します

何がうまくいかないのですか?

前述のように、CollectionUtil.transformは指定された を使用しTransformerて の各要素に対して変換を実行し、それを元の であるにCollection格納します。CollectionstrList

のソースである可能性が高いため、によってList作成されたArrays.asListは によってサポートされているのではないかと疑っています。デバッガーを実行すると、. (Eclipse を使用し、Windows 上の JRE 6 で実行されます。)String[]ArrayStoreExceptionString[5]

この例は何を示していますか?

これは、ジェネリックがないためにタイプセーフではないコードを記述でき、その結果、実行時に問題が発生する典型的な例です。コードがジェネリックを使用して記述されていた場合 (および Apache Commons Collection がジェネリックをサポートしていた場合)、これらのタイプの問題はコンパイル時に検出されます。

結論として、型要素を a に変換することはできません。 にが含まれているList場合、はa のみを返す必要があります。ListStringTransformer.transformString

何ができるでしょうか?

別の方法として、Google Collectionsには、指定されCollections2.transformた を受け取り、によって変換されたCollectionを返すメソッドがあります。CollectionFunction

このメソッドはジェネリックをサポートしているため、タイプセーフであり、新しいものCollectionを返すという事実は、変換によって型が変更される可能性があることを意味します。

于 2010-01-16T03:13:13.120 に答える