Types 伴随对象隐藏类——bug还是特性?
在Kotlin中,以下代码似乎是合理的:Types 伴随对象隐藏类——bug还是特性?,types,kotlin,shadowing,companion-object,data-class,Types,Kotlin,Shadowing,Companion Object,Data Class,在Kotlin中,以下代码似乎是合理的: data class Foo(val bar: String) { fun combine(other: Foo): Foo { return Foo(bar + other.bar) } companion object Foo { fun someHelper() {} } } 但是,它不会编译:typeFoo绑定到Foo.Foo,而不是Foo 这是一个(语言设计或编译器)错误,还是
data class Foo(val bar: String) {
fun combine(other: Foo): Foo {
return Foo(bar + other.bar)
}
companion object Foo {
fun someHelper() {}
}
}
但是,它不会编译:typeFoo
绑定到Foo.Foo
,而不是Foo
这是一个(语言设计或编译器)错误,还是一个特性?如果是后者,在有伴生对象的情况下实现组合的惯用方法是什么
当然,我会考虑一个解决办法:
fun combine(other: my.package.Foo): my.package.Foo {
return Foo(bar + other.bar)
}
但这不太好,是吗?根据,解决方案是省去名称:
companion object {
fun someHelper() {}
}
这将创建一个伴随对象,而不会与类名冲突(正如显式命名的伴随对象Foo
所做的那样)。它的方法仍然可用作Foo.someHelper()
,这是Foo.Companion.someHelper()
的缩写。根据,解决方案是省去名称:
companion object {
fun someHelper() {}
}
这将创建一个伴随对象,而不会与类名冲突(正如显式命名的伴随对象Foo
所做的那样)。它的方法仍然可用作Foo.someHelper()
,这是Foo.Companion.someHelper()
的缩写。当然,我可以重命名Companion对象。但这会挫败它的大部分目的,不是吗?我不明白为什么它会挫败它的目的。命名它以及使用与类相同的名称的目的是什么?@JBNizet如果伴生对象上的方法要以任何合理的方式替换静态方法,伴生对象最好具有相同的名称。例如,就像Scala那样。不,Kotlin不是这样工作的。如果希望伴生对象中的方法是类的静态方法,则应使用@JvmStatic
注释它们。否则,您可以使用Foo.Companion.someHelper()在Java中访问它们。在Kotlin中,您可以只使用Foo.someHelper()。@JBNizet在本次讨论中,我非常关心Kotlin编译器如何在JVM字节码中表示伴随对象及其方法。关键是,静态方法在Java中有一定的用途,而伴随对象在Kotlin中显然也有同样的用途。与母班同名就是其中的一部分。考虑到这种精确的行为是通过省略对象名来实现的(见下面我的答案),我认为我的想法与Kotlin的设计者一致。当然,我可以重命名伴随对象。但这会挫败它的大部分目的,不是吗?我不明白为什么它会挫败它的目的。命名它以及使用与类相同的名称的目的是什么?@JBNizet如果伴生对象上的方法要以任何合理的方式替换静态方法,伴生对象最好具有相同的名称。例如,就像Scala那样。不,Kotlin不是这样工作的。如果希望伴生对象中的方法是类的静态方法,则应使用@JvmStatic
注释它们。否则,您可以使用Foo.Companion.someHelper()在Java中访问它们。在Kotlin中,您可以只使用Foo.someHelper()。@JBNizet在本次讨论中,我非常关心Kotlin编译器如何在JVM字节码中表示伴随对象及其方法。关键是,静态方法在Java中有一定的用途,而伴随对象在Kotlin中显然也有同样的用途。与母班同名就是其中的一部分。考虑到这种精确的行为是通过省略对象名称来实现的(见下面我的答案),我认为我的想法与Kotlin的设计师一致。