Ожидание объявления члена с помощью ArrayList - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь создать ArrayList в классе, например:

class ConvertableTests : BaseTest(){

   var categories = ArrayList<String>()
   categories.add('a') <---- //Expecting member declaration error here

   inner class ConvertableClass : Convertible...

Почему я не могу добавлять объекты в свой список массивов после инициализации списка?

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Вы можете добавлять элементы в список после инициализации списка , если вы не делаете этого в области root класса. Так же, как если бы вы попытались сделать то же самое в Java.

т.е.

//this won't work, like you just found out
class Example {
    var categories = ArrayList<String>()
    categories.add("a") // this isn't inside a function or an `init` block
}

Вам нужно поместить его внутри функции или блока init

fun functionExample() {
    var categories = ArrayList<String>()
    categories.add("a") // This would work fine
}

или

class Example {
    var categories = ArrayList<String>()
    init {
        categories.add("a")
    }
}

Чтобы уточнить пример Сергея с apply и почему это работает, если вы не делаете это внутри функции или init

class Example {
    var categories = ArrayList<String>().apply {
        add("a") 
     } 
}

Компилятор kotlin выполняет оптимизацию и фактически обрабатывает ее так, как если бы вы помещали ее в блок init. Если вы декомпилируете это и посмотрите, что происходит, он на самом деле это делает

/// Это то, что он компилирует обратно в Java publi c Example () {ArrayList var8 = new ArrayList (); var8.add ("а"); this.category = var8; }

То же самое, что происходит, когда вы используете блок init.

Надеюсь, что это поможет!

2 голосов
/ 10 июля 2020

Вы можете использовать блок init для инициализации массива:

class ConvertableTests : BaseTest() {

    var categories = ArrayList<String>()
    init {
        categories.add("a")
    }
    // ...
}

Или apply функция расширения:

var categories = ArrayList<String>().apply {
    add("a") 
}

Также вы должны использовать двойные кавычки " для добавления a String:

var categories = ArrayList<String>()
categories.add("a")

Для Char s используются одинарные кавычки:

var categories = ArrayList<Char>()
categories.add('a')
...