如何在Kotlin中实现接收两个Int参数的次级构造器?
如何实现接收两个Int参数的次级构造器?
首先咱们先搞清楚你遇到的问题根源:Kotlin中所有的次级构造器必须直接或间接调用主构造器(通过:this(...)语法)。你的Test类主构造器要求一个String类型的name参数,但你在次级构造器里把Int类型的data传给了this(data),这就触发了类型不匹配的错误——主构造器要String,你给了Int,当然会报错啦。
接下来给你几个可行的解决方案,你可以根据自己的需求选择:
方案1:把Int参数转成String传给主构造器
如果你的name字段可以接受Int转成的字符串(比如把第二个Int参数作为name的来源),直接用toString()转换就行:
class Test(var name: String) { // 把data转成String传给主构造器 constructor(age: Int, data: Int) : this(data.toString()) { println("$age $data") } fun display() { println("hello world $name") } } fun main(args: Array<String>) { val t = Test("john") val t1 = Test(10, 25) t.display() // 输出 hello world john t1.display() // 输出 hello world 25 }
方案2:给主构造器的name加默认值,自定义name赋值逻辑
如果name和这两个Int参数没有直接的转换关系,你可以给主构造器的name设置一个默认值,然后在次级构造器里根据Int参数给name赋值:
class Test(var name: String = "") { constructor(age: Int, data: Int) : this() { println("$age $data") // 这里可以根据你的需求自定义name,比如拼接age和data name = "User_$age" } fun display() { println("hello world $name") } } fun main(args: Array<String>) { val t = Test("john") val t1 = Test(10, 25) t.display() // 输出 hello world john t1.display() // 输出 hello world User_10 }
方案3:用工厂方法替代次级构造器(更符合Kotlin风格)
其实Kotlin并不推荐过度使用次级构造器,更推荐用伴生对象的工厂方法来实现不同的实例创建逻辑,代码可读性更好:
class Test(var name: String) { companion object { // 工厂方法:接收两个Int参数,返回Test实例 fun createFromInts(age: Int, data: Int): Test { val testInstance = Test("Age_$age") // 自定义name生成逻辑 println("$age $data") return testInstance } } fun display() { println("hello world $name") } } fun main(args: Array<String>) { val t = Test("john") val t1 = Test.createFromInts(10, 25) t.display() t1.display() }
另外,你之前代码里的警告Variable 't1' is never used,只要在main里调用t1.display()或者使用这个变量,警告就会消失啦。
内容的提问来源于stack exchange,提问作者user9865139
相关产品推荐
相关产品推荐

