Как инициализировать массив классов в котлине? - PullRequest
1 голос
/ 16 марта 2019

Я получаю сообщение об ошибке при указании типа и размера массива классов

Я пытался:

fun main(args :Array<String>) {

    class modul() {
        var nommodul: String? = null
        var coeff: Int? = null
        var note: Int? = null
    }

    var releve

    class notes() {
        var releve: array<modul>(10){""} here the erreur 


    }
}

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Прежде всего, ваш код содержит несколько ошибок. Это может быть проблема MCVE и / или копирования-вставки, но мне нужно решить их, прежде чем начать работу с массивами.

var releve до notes класса не допускается. Вы не назначаете его, вы не объявляете тип, и компилятор будет жаловаться, если вы скопируете код из своего вопроса.

Во-вторых, сам массив var: Array в верхнем регистре, а инициализация - отдельная. Это было бы более правильно ( обратите внимание, что это все еще не работает - решение для этого будет дано позже в этом ответе):

var releve: Array<modul> = Array(10) {...}
// or
var releve = Array<modul>(10) {...}

И последнее, прежде чем я начну с самого массива: прочитайте языковые соглашения , особенно названия. Все ваши занятия должны начинаться с заглавной буквы.


Массивы Kotlin во многом отличаются от массивов Java, но наиболее заметным из них является то, что для прямой инициализации массива также требуется инициализатор.

Ожидается, что скобки создадут новый экземпляр, а вы - нет. Вы создаете строку, которая в вашем случае не modul.

Есть несколько способов исправить это в зависимости от того, как вы хотите это сделать.

Если у вас есть экземпляры, которые вы хотите добавить в массив, вы можете использовать arrayOf:

arrayOf(modulInstance, modulInstance2, ...)

Если вы хотите создать их напрямую, вы можете использовать свой подход:

 var releve = Array(10) { modul() } 

Примечание по поводу обоих: из-за инициализации вы получаете автоматический вывод типа и вам не нужно явно объявлять <modul>


Если вам нужны массивы в стиле Java, вам нужен массив нулей.

Есть два способа сделать это:

var releve = arrayOfNulls<modul>(10)
// or
var releve = Array<modul?>(10) { null }

Я настоятельно рекомендую первый, потому что он чище. Хотя я не уверен, что есть разница в производительности.

Обратите внимание, что это выводит в массив обнуляемый тип, но позволяет работать с массивами аналогично Java. Инициализация с этой точки аналогична Java: releve[i] = modul(). Этот подход в основном полезен, если у вас есть аргументы, которые вы хотите добавить в каждый из классов, и вам нужно сделать это вручную. Использование ручных инициализаторов также предоставляет вам индекс ( см. Документацию ), который вы можете использовать при инициализации.

Обратите внимание, что если вы используете цикл for для инициализации, вы также можете использовать Array(10) { YourClass() } и использовать предоставленный индекс, если вам нужна какая-либо чувствительная к индексу информация, такая как аргументы функции. Конечно, нет ничего плохого в использовании цикла for, но он может быть чище.


Дальнейшее чтение

0 голосов
/ 16 марта 2019

вот несколько примеров инициализации массива kotlin:

массив метода Library

val strings = arrayOf("January", "February", "March")

Примитивные массивы

val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)

Поздняя инициализация с индексами

val array = arrayOfNulls<Number>(5)

for (i in array.indices) {
    array[i] = i * i
}

Подробнее см. Kotlin - Основные типы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...