如何在 Kotlin 中像构造函数一样实现 Java



我一直在尝试在 kotlin 中的 heelo 世界程序中添加一个辅助构造函数。以下是我的代码。(我使用在线 kotlin ide https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt(

class Test(var name:String){
constructor(age:Int,data:Int){
println("$age $data")
}
fun display(){
println("hello world $name")
}
}
fun main(args: Array<String>) {
var t=Test("john")
var t1=Test(10,25)
t.display()
}

但它向我显示以下错误

Simplest version.kt
Error:(8, 4) Primary constructor call expected
Warning:(18, 8) Variable 't1' is never used

经过一些谷歌搜索,我解决了错误。 将辅助构造函数的第二个参数更改为字符串类型并添加 :this(data( 解决了问题。以下是已解决的代码

class Test(var name:String){
constructor(age:Int,data:String):this(data){
println("$age $data")
}
fun display(){
println("hello world $name")
}
}
fun main(args: Array<String>) {
var t=Test("john")
var t1=Test(10,"25")
t.display()
}

但问题是我想将两个整数值传递给辅助构造函数。我尝试了以下内容,但它给出了此错误

class Test(var name:String){
constructor(age:Int,data:Int):this(data){
println("$age $data")
}
fun display(){
println("hello world $name")
}
}
fun main(args: Array<String>) {
var t=Test("john")
var t1=Test(10,25)
t.display()
}

但它给出了这个错误

Simplest version.kt
Error:(8, 39) Type mismatch: inferred type is Int but String was expected
Warning:(17, 8) Variable 't1' is never used

我如何实现这一点?如何将两个整数变量传递给辅助构造函数?

在 kotlin 中,你必须从附加构造函数调用主构造函数。据我了解,您希望拥有 2 个输入完全不同的构造函数。有很多方法可以实现这一点。首先是从其他构造函数中定义默认值。

class Test(var name:String) {
constructor(age:Int,data:Int):this("default name here"){
println("$age $data")
}
fun display(){
println("hello world $name")
}
}

上面的代码使用默认字符串作为参数调用主构造函数,因为您不打算在其他构造函数上接受此名称参数。

另一种方法是可选参数。可以将主构造函数参数定义为可选参数。这样,您就不必在主构造函数调用中提供值。

class Test(var name:String = "default value here") {
constructor(age:Int,data:Int):this(){
println("$age $data")
}
fun display(){
println("hello world $name")
}
}

不过,第二种方法有一个问题。您现在(实际上(有 3 个构造函数,其中 1 个为空。

@tompee的答案更好。但这是另一种选择:

class Test(var name: String) {
constructor(age: Int, data: Int, name: String) : this(name) {
println("$age $data $name")
}
fun display() { println("hello world $name") }
}
fun main(args: Array<String>) {
var t = Test("john")
var t1 = Test(10, 25, "peter")
t.display()
}

最新更新