Kotlin扩展类条件分支超值的二级构造函数

时间:2017-08-13 22:37:37

标签: constructor kotlin

如何根据第四个辅助构造函数中的值进行条件超级调用? 为什么这不起作用?

open class SecondaryConstructors{
    constructor(i:Int)
    constructor(s:String)
}
class SecondaryExtended:SecondaryConstructors {
    constructor(i:Int):super(i)
    constructor(s:String):super(s)
    constructor():super(if(true)1 else 0)
    constructor(intOrString:Boolean):super( if(intOrString) 3 else "hey")
    // conditional branch result of int/string is implicitly cast to Any
    // error - none of the following functions can be called with the arguments supplied
}

1 个答案:

答案 0 :(得分:3)

当你的if表达式被传递时,这不会起作用,因为构造函数的参数没有唯一的类型,除了Any,这是最常见的类型。您收到错误,因为没有匹配的构造函数期望Any作为参数。

constructor(intOrString:Boolean):
super( if(intOrString) 3 else "hey")

与Java相同,进行有条件的超级调用是不可能的。必须直接初始化超类型,documentation告诉:

  

如果类没有主构造函数,那么每个辅助构造函数   必须使用super关键字初始化基本类型,或委托给>这样做的另一个构造函数。请注意,在这种情况下不同   辅助构造函数可以调用基类型的不同构造函数