toString () in Kotlin - неправильный вывод - PullRequest
0 голосов
/ 11 июля 2020

Я написал несколько кодов для вывода объектов в массиве с помощью toString ()

, но с использованием Option1 println(path.toString())

Результат: [LRunningpath;@27973e9b

который это не то, что я хочу. Затем я заменяю его на вариант 2, как показано ниже

var i=0
for(i in 0 until path.size)
println(path[i].toString())

, что правильно.

Мои вопросы:

  1. почему вариант 1 не работает?
  2. что означает вывод в Варианте 1?
  3. какие-либо советы, чтобы избежать такой же ситуации в будущем?

Любые подсказки приветствуются. Спасибо за доброту.

мои коды следующие:

fun main() {
    println("Warming up")
    val input1 = Runningpath("in Forest", 2000, "some houses")
    val input2 = Runningpath("at lake", 1500, "a school")
    val path = arrayOf(input1, input2 )
    println(path.toString())
/*    var i=0
    for(i in 0 until path.size)
    println(path[i].toString())
   */
}
class  Runningpath(val name: String, val length: Int, val spot: String){
    override fun toString(): String= "The Path $name ($length m) is near $spot"
}

Ответы [ 2 ]

4 голосов
/ 11 июля 2020

Краткий ответ: в большинстве случаев лучше использовать списки вместо массивов.

Массивы в основном используются по историческим причинам, для совместимости и для реализации низкоуровневых структур данных. В Kotlin они иногда нужны для взаимодействия с Java и для обработки аргументов vararg . Но помимо этого, списки имеют много преимуществ.

Проблема в том, что на JVM массив сильно отличается от всех других объектов. Он имеет только методы, унаследованные от Object , и не переопределяет их. (И вы не можете создавать свои собственные подклассы, чтобы переопределить или добавить к ним.)

В частности, он имеет метод toString() из Object. Это дает код, указывающий тип - здесь [ для массива, L указывает, что каждый элемент является ссылкой, Runningpath указывает тип ссылки, ; и @ разделители и шестнадцатеричное представление код массива ha sh, который может быть его адресом в памяти или каким-то другим уникальным числом.

Итак, если вам нужен другой способ отображения массива, вам придется сделать это «вручную».

Другие проблемы с массивами на JVM возникают из-за того, что у них была типизация во время выполнения - они были частью Java задолго до того, как были добавлены дженерики, и плохо взаимодействуют с дженериками (например, вы не можете создать массив тип generi c) - и одновременно изменяемый и ковариантный (и, следовательно, не безопасный по типу в некоторых случаях).

Список s, как и другие Коллекция s и структуры данных являются собственными объектами: у них есть такие методы, как toString(), которые вы можете переопределить; они могут иметь общие параметры типа c; они безопасны по типу; они могут иметь множество реализаций, включая подклассы; и они гораздо лучше поддерживаются стандартной библиотекой, а также многими сторонними библиотеками. байт памяти) жизнь будет go проще, если вы будете использовать списки вместо массивов!

1 голос
/ 11 июля 2020

Вы можете использовать joinToString для этого:

println(path.joinToString("\n"))

joinToString () фактически доступен как для списка, так и для массива, но я бы рекомендовал использовать список как у вас будет неизменяемость и множество других расширений, которые помогут вам управлять данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...