Scala 为什么和什么时候特质和对象应该有相同的名称?

Scala 为什么和什么时候特质和对象应该有相同的名称?,scala,traits,companion-object,Scala,Traits,Companion Object,这是什么原因 trait Dog { def bark = "woof" } object Dog extends Dog 工作正常,但以下情况不起作用 trait Dog { def bark = "woof" } class Dog extends Dog 我在某个地方读到,在上面提到的第一种情况下,物体不是伴生物体。当对象和特征应该具有相同的名称时,会出现什么情况?来自第2章()的引言: 有两个不同的名称空间,一个用于类型,另一个用于术语 第5.5节()几乎完全

这是什么原因

  trait Dog {
    def bark = "woof"
  }
  object Dog extends Dog
工作正常,但以下情况不起作用

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

我在某个地方读到,在上面提到的第一种情况下,物体不是伴生物体。当对象和特征应该具有相同的名称时,会出现什么情况?

来自第2章()的引言:

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

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

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

(强调矿山)

第二个例子是
class Dog extensed Dog
不起作用,因为
class Dog
trait Dog
最终都位于类型的命名空间中,这会导致冲突

当您在Java中使用静态方法时,就会使用Companion
object
s(除了Companion对象更好,因为它们是对象,可以作为普通值传递)

这种情况
objectfoo-extends-Foo
似乎有些做作,相当罕见。你有没有一个实际的例子来说明它的用途?如果不是,那么它只是一个正式有效的角落案例,仅仅因为它没有被明确禁止


编辑:似乎是
对象X扩展X
模式最“重要”的应用程序之一。

第二个示例失败的原因不是因为Dog不是伴生对象,而是因为您定义了一个新的重复类Dog。我总是将
traits
classes
视为一个类别,将
objects
视为另一个类别,而
object
是trait或classes的单例实例

为什么不能创建同名的类? 如果允许的话,不可能区分两个实体

为什么可以使用相同的名称创建(类/特征)和对象? 您可以区分它们,因为
class
trait
是类型,object是值

什么时候应该将对象命名为与类相同的名称?
如果您不想定义伴生对象,那么您对该对象的隐式将起作用。或者,如果要在对象上定义方便的
应用
方法。否则,我根本不关心对象是否是
companion
,而是经常使用类名创建对象以方便使用。

它在标准库中使用,看一看,这个用例似乎是为了提供它们的伴生类/特征的默认实例,但是由于缺乏相关文档,我认为,可能它并不打算被普遍使用。