Kotlin - конвертировать коллекцию в список массивов - PullRequest
0 голосов
/ 09 января 2019

Я конвертирую Java-приложение в Kotlin. В одной области используются функции FileUtils listFiles из Apache IO.

Эти возвращаемые коллекции, и у меня возникают проблемы с преобразованием / приведением коллекций в ArrayList

        val myFiles = FileUtils.listFiles(mediaStorageDir, extensions, true) as ArrayList<File>

В то время как это компилируется, я получаю ошибку времени выполнения следующим образом:

java.util.LinkedList нельзя преобразовать в java.util.ArrayList

Как правильно преобразовать объект коллекции в ArrayList?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Оператор as является приведением. Но приведение не преобразовывает значение в данный тип; актер заявляет, что значение уже этого типа.

A LinkedList не является ArrayList, поэтому, когда вы заявите, что это так, компьютер сообщит вам о вашей ошибке - как вы видите!

Вместо этого вам нужно * преобразовать значение. Возможно, лучший способ - вызвать функцию расширения .toArrayList(). В качестве альтернативы, вы можете явно вызвать конструктор: ArrayList(…).

(* Это предполагает, что вам на самом деле нужен ArrayList. На практике обычно гораздо лучше ссылаться только на интерфейс, в данном случае List или MutableList. Как и в других комментариях, функция, которую вы используете объявлено, что вызов возвращает Collection, текущая реализация может вернуть вам LinkedList сейчас, но это может измениться, поэтому безопаснее не предполагать, что он реализует какой-либо из этих интерфейсов, а вместо этого вызывать .toList() или .toMutableList().)

0 голосов
/ 09 января 2019

ArrayList - класс с деталями реализации. FileUtils возвращает LinkedList, и именно поэтому у вас возникают проблемы. Вместо этого вы должны выполнить приведение к List<File>, поскольку это интерфейс, который реализуют как ArrayList, так и LinkedList.

Если вам нужно изменить возвращенный список, вы можете использовать MutableList<File> вместо неизменяемого.

Но это не лучший подход, потому что, если создатели FileUtils позже изменят детали реализации своих коллекций, ваш код может начать падать.

Лучшей подсказкой, если явно требуется, чтобы это был arrayList вместо общего списка:

val myFiles = FileUtils.listFiles(mediaStorageDir, extensions, true)
val array = arrayListOf<File>()
array.addAll(myFiles)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...