在Kotlin多平台中无法访问预期的类构造函数参数

7

我目前正在使用Kotlin开发跨平台模块。为此,我依赖于expect/actual机制。

我在Common.kt中声明了一个简单的类:

expect class Bar constructor(
    name: String
)

我想在一个公共方法中使用定义的类(也存在于Common.kt中):

fun hello(bar: Bar) {
    print("Hello, my name is ${bar.name}")
}

实际实现定义在Jvm.kt中:
actual data class Bar actual constructor(
    val name: String    
)

问题是在我的 hello 函数中出现了以下错误:

未解决的引用:name

我做错了什么?


尝试从expect类中删除“constructor”。 - Chamel
在“建议”任何东西之前,请至少在您的计算机上尝试它。 - Farid
2个回答

4

期望的类构造函数不能有属性参数

因此,需要将该属性描述为类成员,使用 val name: String

'Bar' 的实际构造函数没有相应的期望声明

然而,为了让实际构造函数匹配期望的声明,参数数量必须相同。这就是为什么在构造函数中除了存在属性外,还要添加 name: String 作为 参数 的原因。

expect class Bar(name: String) {
    val name: String
}

actual class Bar actual constructor(actual val name: String)

注意:如果我们在期望的类中不填写构造函数,当在当前类中添加构造函数时,IDE会发出不兼容的警告。 GL

2
虽然这段代码可能回答了问题,但提供关于为什么和/或如何回答问题的附加上下文可以提高其长期价值。 - Donald Duck
1
是的@Braian,以你的经验应该更清楚:)我不会投票删除,但请解释一下为什么需要添加val - Mike Szyndel

0

expect部分,构造函数参数列表或成员属性中也应该有val name


如果我这样做,就会得到“预期类构造函数不能有属性参数”的错误。 - Benjamin
然后按照第二部分的说明添加一个成员属性。实际类仍应能够将其实现为属性构造函数参数。 - Alexey Romanov
如果我这样做,就无法实例化类:期望的类Bar没有默认构造函数 - Benjamin
哪一行出现了错误?我不明白为什么需要一个默认构造函数。 - Alexey Romanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接