Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 伴随对象隐藏类——bug还是特性?_Types_Kotlin_Shadowing_Companion Object_Data Class - Fatal编程技术网

Types 伴随对象隐藏类——bug还是特性?

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 这是一个(语言设计或编译器)错误,还是

在Kotlin中,以下代码似乎是合理的:

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

    companion object Foo {
        fun someHelper() {}
    }
}
但是,它不会编译:type
Foo
绑定到
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的设计师一致。