首页 > 解决方案 > 如何在 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 


    }
}

标签: classoopkotlin

解决方案


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

var relevenotes不允许上课之前。你没有分配它,你没有声明一个类型,如果你从你的问题中复制粘贴代码,编译器会抱怨。

其次,数组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 循环当然没有错,但它可以更简洁。


进一步阅读


推荐阅读