class - 如何在 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
}
}
解决方案
首先,您的代码有几个错误。这可能是 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 循环当然没有错,但它可以更简洁。
进一步阅读
推荐阅读
- python - 如何从列表项中删除“\n”
- go - 如何获取给定 k8s 资源的 json 的 schema.GroupVersionResource
- bash - 需要帮助使用空白行 (BASH) 拆分文件
- javascript - 在 TypeScript 中递归地进行树遍历的异步/等待
- django - Django模型通过图像调整大小保存两次
- css - 在包装上居中多个 div
- google-analytics - 今天如何将服务器发起的事件发送到 Google Analytics 4?
- mysql - Wordpress - MySQL 查询仅显示来自特定类别的帖子
- javascript - JS如何检查页面是否在SSRS中打开
- arrays - C中的“终止”数组