Scala类的“伴生对象”可以看作是具有与类相同的完全限定名称(即相同的名称,在相同的包中)的单例对象。它们用于保存对于类的所有实例都通用的实用函数,作为Java中static
方法的替代。
然而,在文档和问题的各个地方,它说伴生对象必须在同一编译单元中定义。例如,它们必须在同一文件中定义;不能为Java对象定义伴生对象;在REPL中,它们必须在同一输入行中定义,因此会出现警告消息:
warning: previously defined class Foo is not a companion to object Foo.
Companions must be defined together; you may wish to use :paste mode for this.
这意味着类和其伴生对象之间必须有区别,而只是具有相同(完全限定)名称的类和对象则不然。这个区别是什么?