如何在Kotlin中初始化类的数组?

时间:2019-03-16 12:34:23

标签: class oop kotlin

输入类数组的类型和大小时出现错误

我尝试过:

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 个答案:

答案 0 :(得分:1)

首先,您的代码有几个错误。这可能是MCVE和/或复制粘贴问题,但是在开始使用阵列之前,我需要解决这些问题。

不允许在var releve类之前使用

notes。您没有分配它,也没有声明类型,并且如果您从问题中复制粘贴代码,编译器将抱怨。

第二,数组var本身:Array是大写的,并且初始化是独立的。这样会更有效(请注意,这仍然行不通-该解决方案将在此答案后面提供):

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

关于数组本身的最后一件事:请阅读the language conventions,尤其是命名的。您的课程都应该以大写字母开头。


Kotlin数组在很多方面与Java数组有很大不同,但是最值得注意的是直接数组初始化还需要一个初始化程序。

应该使用方括号创建一个新实例,而您不会这样做。您创建的字符串(在您的情况下不是modul)。

有多种方法可以解决此问题,具体取决于您要执行的操作。

如果有要添加到阵列的实例,则可以使用arrayOf

arrayOf(modulInstance, modulInstance2, ...)

如果要直接创建它们,可以使用以下方法:

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

关于这两个方面的注释:由于初始化,您将获得自动类型推断,而无需显式声明<modul>


如果要使用Java样式的数组,则需要一个null数组。

有两种方法可以做到这一点:

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

我强烈推荐第一个,因为它更干净。我不确定在性能方面是否存在差异。

请注意,这确实会为数组推断可为空的类型,但是它使您可以以类似于Java的方式使用数组。此时的初始化就像Java:releve[i] = modul()。如果您有要添加到每个类的参数并且需要手动添加,则此方法最有用。使用手动初始化程序还可以为您提供一个索引(see the documentation),您可以在初始化时使用它。

请注意,如果您使用for循环进行初始化,则也可以使用Array(10) { YourClass() },如果需要任何对索引敏感的信息(例如函数参数),则可以使用提供的索引。使用for循环当然没有错,但是可以更干净。


进一步阅读

答案 1 :(得分:0)

这里是kotlin数组初始化的一些示例:

库方法数组

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 - Basic Types