首页 > 解决方案 > 为什么以及何时应该 trait 和 object 具有相同的名称?

问题描述

这是什么原因

  trait Dog {
    def bark = "woof"
  }
  object Dog extends Dog

有效,但以下无效

trait Dog {
  def bark = "woof"
}
class Dog extends Dog

我在某处读到,在上面提到的第一种情况下,该对象不是伴随对象。对象和特征应该具有相同名称的情况是什么?

标签: scalatraitscompanion-object

解决方案


从介绍到第 2 章(标识符、名称和范围):

有两种不同的名称空间,一种用于类型,一种用于术语

第 5.5 节(对象定义)几乎完全包含您的示例(使用Point而不是Dog),并带有以下注释:

请注意,名称的双重使用Point是合法的,因为类定义在类型名称空间中定义名称 Point,而对象定义在术语命名空间中定义名称。

(强调我的)

你的第二个例子class Dog extends Dog不起作用,因为class Dog和都trait Dog在类型的命名空间中,这会导致冲突。

每当您在 Java 等中使用静态方法时,都会使用Companion object(除了伴随对象更好,因为它们是对象,并且可以作为普通值传递)。

这种情况object Foo extends Foo显得有些做作,而且相当罕见。你有一个使用它的实际例子吗?如果不是,那么它只是一个正式有效的极端情况,仅仅是因为它没有被明确禁止。

编辑object AnsiColor extends AnsiColor似乎是该object X extends X模式最“重要”的应用之一。


推荐阅读