ArrayStoreException
возникает, когда делается попытка сохранить объект неправильного типа в массиве.
Что делает код?
В приведенном примере кода метод CollectionUtil.transform
принимает Collection
и выполняет преобразование элементов на месте, что означает, что Object
s вынутый из оригинала Collection
(такой как List
) и помещенный обратно в тот же Collection
.
Код для Transformer
принимает String
и преобразует его в Integer
- это основная проблема здесь - тип объекта изменяется при преобразовании применяется .
Что может быть не так?
Как упоминалось ранее, CollectionUtil.transform
будет использовать данный Transformer
и выполнит преобразование для каждого элемента в Collection
и сохранит его обратно в исходный Collection
, который является strList
.
Я подозревал, что List
, созданный Arrays.asList
, поддерживается String[]
, поскольку это, вероятно, будет источником ArrayStoreException
. Запуск отладчика подтвердил это, поскольку он был поддержан String[5]
. (Используя Eclipse, работающий на JRE 6 в Windows.)
Что иллюстрирует этот пример?
Это яркий пример того, как отсутствие обобщений позволяет писать код, который не является безопасным для типов, и, следовательно, возникает проблема во время выполнения. Если код был написан с использованием дженериков (и Apache Commons Collection его поддерживал), эти типы проблем будут обнаружены во время компиляции.
Нижняя строка - нельзя преобразовать элементы типа в List
- если List
содержит String
с, Transformer.transform
должен возвращать только String
.
Что можно сделать?
В качестве альтернативы Google Collections имеет метод Collections2.transform
, который принимает заданный Collection
и возвращает Collection
, преобразованный в Function
.
Этот метод поддерживает дженерики, поэтому он безопасен от типов, и тот факт, что он возвращает новый Collection
, означает, что типы могут изменяться в процессе преобразования.