Kotlin объект-компаньон неожиданный результат - PullRequest
0 голосов
/ 28 февраля 2020
sealed class Color () {
    sealed class Dark (): Color() {
    object DarkRed : Dark()
    object DarkBlue : Dark()
    }   
    override fun toString(): String = when (this) {
        is Color.Dark -> "Dark"
        is Color.Dark.DarkRed -> "Dark Red"
        is Color.Dark.DarkBlue -> "Dark Blue"
    }
    companion object Companion {
    fun make(name: String): Color = when (name) {
        "DarkRed" -> Color.Dark.DarkRed 
        "DarkBlue" -> Color.Dark.DarkBlue
        else -> throw Exception ("Error unkown color '$name'") 
    }
    }
}
fun main(args: Array<String>) {
    val color = Color.Companion.make("DarkRed")
    println (color.toString()) // Dark is printed not "Dark Red"
}

Приведенный выше код печатает Темно , в то время как я ожидал Темно-красный . Кажется, что make возвращенный тип Color.Dark.DarkRed интерпретируется как Color.Dark функцией ofString () , почему

Ответы [ 2 ]

3 голосов
/ 28 февраля 2020

Поскольку значение DarkRed равно , оба значения Dark и DarkRed, а is Dark проверяется перед is DarkRed.

when введет первое предложение, которое разрешается в true.

Чтобы исправить это, поместите наиболее специфичные c проверки перед меньшими спецификациями c проверки.

1 голос
/ 28 февраля 2020

Вы можете просто поместить строку is Color.Dark -> "Dark" в конец функции toString. В вашем случае is Color.Dark возвращает true для DarkRed.

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