Сопутствующие объекты скрывают класс - ошибка или особенность?
В 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()
,