Как я могу реализовать Java как конструкторы в Kotlin - PullRequest
0 голосов
/ 01 июня 2018

Я пытался добавить вторичный конструктор в мою программу heelo world на kotlin.Ниже мой код.(Я использовал онлайн 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

После некоторого поиска в Google я решил эту ошибку. Изменив второй параметр вторичного конструктора наТип строки и добавление: 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

Как мне этого добиться? Как передать две целочисленные переменные вторичному конструктору?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

В 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")
    }
}

Приведенный выше код вызывает основной конструктор со строкой по умолчанию в качестве параметра, поскольку вы не планируете принимать этот параметр имени в дополнительном конструкторе.

Другим способом являются необязательные параметры.Вы можете определить свой основной аргумент конструктора как необязательный параметр.Таким образом, вам не нужно указывать значение в первичном вызове конструктора.Теперь у вас есть (эффективно) 3 конструктора, 1 из которых пуст.

0 голосов
/ 01 июня 2018

@ Томпи ответ лучше.Но это еще один вариант:

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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...