伴随对象隐藏类 - 错误或功能?

时间:2017-03-26 15:35:35

标签: 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() {}
    }
}

但是,它没有编译:类型Foo绑定到Foo.Foo而不是Foo

这是(语言设计或编译器)错误,还是这个功能?如果是后者,在伴侣对象存在的情况下实现combine的惯用方法是什么?

当然,我会考虑解决方法:

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

但这不太好,现在是吗?

1 个答案:

答案 0 :(得分:2)

根据documentation,解决方案是省略名称:

class Robot(pygame.sprite.Sprite):

    def __init__(self, group):
        super(Robot, self).__init__(group)
        self.num_box = random.randint(1,5)
        for box in self.numBox:
            box = Box(group):

class Box(pygame.sprite.Sprite):

    def __init__(self, group):
        super(Box, self).__init__(group)
        bug = Bug(group)

class Bug(pygame.sprite.Sprite):

    def __init__(self, group):
        super(Bug, self).__init__(group)
        ...

def main():
    group = pygame.sprite.Group()
    robot = Robot(group)
    while True:
        group.update()

这将创建一个伴随对象,而不会与类名冲突(作为明确命名的伴随对象companion object { fun someHelper() {} } )。它的方法仍以Foo形式提供,Foo.someHelper()的缩写。