伴随对象隐藏 class -- 错误或功能?
Companion objects hide class -- bug or feature?
在 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)
}
但这不太好,是吗?
根据 documentation,解决方案是省略名称:
companion object {
fun someHelper() {}
}
这将创建一个伴生对象,而不会与 class 名称冲突(正如明确命名的伴生对象 Foo
所做的那样)。它的方法仍然可用 Foo.someHelper()
,shorthand for Foo.Companion.someHelper()
.
在 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)
}
但这不太好,是吗?
根据 documentation,解决方案是省略名称:
companion object {
fun someHelper() {}
}
这将创建一个伴生对象,而不会与 class 名称冲突(正如明确命名的伴生对象 Foo
所做的那样)。它的方法仍然可用 Foo.someHelper()
,shorthand for Foo.Companion.someHelper()
.