В 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?
myList = nullа затем добавить вызов без!!. Вы можете преодолеть это, используяlateinitключевое слово перед своим свойством, вот так:lateinit var myList: List<Int>таким образом вам не нужно будет инициализировать список немедленно, но вы гарантируете компилятору, что инициализируете его перед первым использованием списка. Это более плавное решение, но оно возлагает на вас ответственность как разработчика.