Kotlin странный вывод при использовании println для экземпляра класса - PullRequest
0 голосов
/ 21 мая 2019

Я получаю Person @ 4b67cf4d в качестве вывода.

fun main(args: Array<String>){
    var person = Person("Jimmy")
    println(person)
}


class Person(val name: String){
    var age = 10
}

Вывод должен быть Джимми.Извините, если я не достаточно ясно, я только начал изучать Kotlin и не мог найти решение для этого.

Ответы [ 4 ]

4 голосов
/ 21 мая 2019

Вы должны переопределить метод toString() внутри класса Person:

class Person(val name: String){
    var age = 10

    override fun toString(): String {
        return name
    }
}

Теперь ваш код напечатает:

Jimmy

, а не хеш-код.

2 голосов
/ 21 мая 2019

Вы должны напечатать переменную имени объекта Person.

Так что просто будьте println(person.name)

Используя println(person), вы просто печатаете хеш экземпляра объекта

Btw. Вы можете просто вставить этот класс как class Person(val name: String, var age: Int = 10)

1 голос
/ 21 мая 2019

Краткий ответ: переопределить toString () .

Java и Kotlin имеют стандартный способ преобразования любого объекта в строку: метод toString().

Это определено в классах верхнего уровня java.lang.Object и в kotlin.Any , поэтому каждый объект гарантированно имеет этот метод.Реализации там просто возвращают имя класса, за которым следуют '@' и шестнадцатеричное представление хеш-кода объекта .(Они должны работать для каждого возможного типа объекта, поэтому у них нет никакой другой информации для использования.)

Это то, что вы видите в своих выходных данных.

Если вы хотитечтобы ваш класс показывал что-то более значимое, вам следует переопределить метод toString() в вашем классе Person.Например, чтобы показать имя в соответствии с запросом:

override fun toString() = name

Однако на практике это не всегда лучший подход.toString() будет вызываться всякий раз, когда ваши объекты печатаются в журналах, в сообщениях об ошибках и т. П., Поэтому более полезно иметь менее двусмысленное представление, например:

override fun toString() = "Person($name, $age)"

(В качестве альтернативы вы могли бысделайте его классом данных , который автоматически предоставит подходящую реализацию toString(), наряду с некоторыми другими вещами.)

Когда вы хотите напечатать только затем имя, вы можете сделать это явно:

println(person.name)

Или вы можете предоставить отдельный метод для вызова, например:

fun toPrettyString() = name

, а затем:

println(person.toPrettyString())

Это сделает ваши намерения намного яснее.

0 голосов
/ 21 мая 2019

Просто используйте data class

fun main(args: Array<String>){
    var person = Person("Jimmy")
    println(person)
}


data class Person(val name: String, var age = 10)

Выход будет

Person(name=Jimmy,age=10)

Если вы хотите вывести именно «Jimmy», выведите name field:)

fun main(args: Array<String>){
    var person = Person("Jimmy")
    println(person.name)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...