有一个初始抽象类
abstract class GrandDad(val params:Array<Any>) {
...
}
另一个抽象类继承自它
abstract class Dad(params: Array<Any> = arrayOf()) : GrandDad(params) {
...
}
而常规类继承自它
class Son(param:String) : Dad(arrayOf(param)) {
....
}
这是我这样做的时候:
val son = Son("test")
结果是val params:Array<Any>一个空数组。那些。看起来参数在从传递Son到时丢失了Dad
整个大脑已经坏了。我究竟做错了什么?
显然,这是编译器中的错误。它应该禁止传递
Array<String>asArray<Any>,因为与 Java 不同,Kotlin 中的数组是不变的(数组类型不是彼此的子类型,即使它们的参数类型是)。但是编译器并没有禁止对超构造函数的这种调用,而是生成了不正确的代码(例如,如果你从 中删除默认值
params: Array<Any> = arrayOf(),那么程序将在运行时从 中崩溃NoSuchMethodError)。我留下了错误报告:https ://youtrack.jetbrains.com/issue/KT-19435
感谢您对细节的关注!
总是这样,你受苦,你受苦,你与某人分享你的痛苦,答案自然而然......
在这里,构造
arrayOf(param)变为Array<String>,并且该类Dad只有构造函数 forArray<Any>and ( !!!! ) 用于无参数构造函数,默认为param = arrayOf()那些。
他们基本上是两个构造函数。
我无法证明这一点,但看起来当传递一个数组而不是
Array<Any>静默地传递时,第二个构造函数被调用。一般来说,这很好用: