В Java мы могли бы сделать следующее
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
Но если мы перепишем его непосредственно в Котлин, как показано ниже
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
Я получил ошибку не найдя add
и remove
функции из моего списка
Я работаю вокруг приведения его к ArrayList, но это странно, когда требуется приведение, тогда как в Java приведение не требуется. И это побеждает цель наличия абстрактного класса List
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
Есть ли способ для меня использовать List, но не нужно его приводить, как то, что можно сделать в Java?
collections
kotlin
Elye
источник
источник
myList = null
а затем добавить вызов без!!
. Вы можете преодолеть это, используяlateinit
ключевое слово перед своим свойством, вот так:lateinit var myList: List<Int>
таким образом вам не нужно будет инициализировать список немедленно, но вы гарантируете компилятору, что инициализируете его перед первым использованием списка. Это более плавное решение, но оно возлагает на вас ответственность как разработчика.Ответы:
https://kotlinlang.org/docs/reference/collections.html
Вам нужно будет использовать
MutableList
список.MutableList<Int> = arrayListOf()
также должен работать.источник
Определение коллекции списков в Kotlin различными способами:
Неизменяемая переменная с неизменным (только для чтения) списком:
Неизменная переменная с изменяемым списком:
или без начального значения - пустой список и без явного типа переменной:
users.add(anohterUser)
илиusers += anotherUser
(под капотом этоusers.add(anohterUser)
)Изменяемая переменная с неизменным списком:
или без начального значения - пустой список и без явного типа переменной:
users += anotherUser
- * создает новый ArrayList и назначает егоusers
Изменяемая переменная с изменяемым списком:
или без начального значения - пустой список и без явного типа переменной:
users.add(anohterUser)
users += anotherUser
см. также: https://kotlinlang.org/docs/reference/collections.html
источник
Согласитесь со всеми приведенными выше ответами об использовании MutableList, но вы также можете добавить / удалить из списка и получить новый список, как показано ниже.
Или
источник
По-видимому, список Kotlin по умолчанию является неизменным. Чтобы иметь список, который может измениться, нужно использовать MutableList, как показано ниже
Обновленный Тем не менее, не рекомендуется использовать MutableList, кроме как для списка, который вы действительно хотите изменить. Ссылка на https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359 о том, как коллекция только для чтения обеспечивает лучшее кодирование.
источник
MutableList
, однако инициализация с помощьюnull
не будет работать. Только допустимые или ненулевые утвержденные вызовы разрешены для обнуляемого получателя типаMutableList<Int>
.doSomething
lateinit
вместо того, чтобы сделать список обнуляемым, является правильным способом решения этой проблемы. Не помню,lateinit
был ли он добавлен с самого начала Kotlin, но сейчас это определенно решение для его использования :-)В Kotlin вы должны использовать
MutableList
илиArrayList
.источник
Вы можете сделать с созданием нового, как это.
Теперь вы можете использовать list2, спасибо.
источник
https://kotlinlang.org/docs/reference/collections.html
По вышеуказанной ссылке Список <E> является неизменным в Котлине. Однако это будет работать:
источник
list2
это изменчивый список, см. Stackoverflow.com/questions/43114367/… .Ограничение изменчивости для строителей
Верхние ответы здесь правильно говорят о разнице в Kotlin между только для чтения
List
(ПРИМЕЧАНИЕ: это только для чтения, а не «неизменяемый» ), иMutableList
.В общем, следует стремиться использовать списки только для чтения, однако изменчивость все еще часто бывает полезна во время создания , особенно при работе со сторонними библиотеками с нефункциональными интерфейсами. Для случаев, когда альтернативные методы построения недоступны, такие как
listOf
непосредственное использование или применение функциональной конструкции, такой какfold
илиreduce
, простая конструкция «функция построителя», подобная следующей, приятно создает список только для чтения из временного изменяемого списка:и это может быть красиво инкапсулировано в многократно используемую встроенную функцию полезности:
который можно назвать так:
Теперь вся изменчивость изолирована от одной области блока, используемой для построения списка только для чтения, а остальная часть вашего кода использует список только для чтения, который выводится из компоновщика.
ОБНОВЛЕНИЕ : Начиная с Kotlin 1.3.70, указанная
buildList
выше точная функция доступна в стандартной библиотеке в качестве экспериментальной функции вместе с ее аналогамиbuildSet
иbuildMap
. См. Https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/ .источник
В концепции неизменяемых данных, возможно, это лучший способ:
источник
list
Находитсяimmutable
наDefault
, вы можете использоватьArrayList
вместо этого. как это :тогда вы можете
add/delete
предметы из этого, как показано ниже:источник