Сопутствующие объекты скрывают класс - ошибка или особенность?

В Kotlin следующий код кажется разумным:

data class Foo(val bar: String) {
    fun combine(other: Foo): Foo {
        return Foo(bar + other.bar)
    }

    companion object Foo {
        fun someHelper() {}
    }
}

Тем не менее, он не компилируется: тип Foo привязывается к Foo.Foo вместо Foo!

Это ошибка (языковой дизайн или компилятор) или это особенность? Если последнее, то какой идиоматический способ реализовать combine в присутствии объекта-компаньона?

Конечно, есть то, что я хотел бы обойти:

fun combine(other: my.package.Foo): my.package.Foo {
    return Foo(bar + other.bar)
}

Но это не так уж хорошо, правда?

1 ответ

Решение

Согласно документации, решение состоит в том, чтобы опустить имя:

companion object {
    fun someHelper() {}
}

Это создаст сопутствующий объект без столкновения с именем класса (как явно названный сопутствующий объект). Foo делает). Его методы все еще доступны как Foo.someHelper()сокращение для Foo.Companion.someHelper(),

Другие вопросы по тегам