我创建了一个类:
class Standalone(val str:String)
{
Console println "Creating : "+this;
override def toString()= " str : "+str;
}
object StandaloneFactory
{
private val standalones= Map("red"-> new Standalone("Red"),"blue"-> new Standalone("Blue"),"green"-> new Standalone("green"));
def getColor(color : String) = if(standalones.contains(color)) standalones(color) else null;
}
我知道Object StandaloneFactory将有一个实例作为StandaloneFactory。我只是想创建一个varalone的Standalonefactory,所以我尝试了这个:
object StandaloneMain
{
def main(args:Array[String])
{
var stdFac:StandaloneFactory= StandaloneFactory;
Console println stdFac;
Console.println(StandaloneFactory.getColor("red"));
}
}
但是这不会编译并给出如下错误: 错误:找不到:输入StandaloneFactory
现在我改变了
var stdFac:StandaloneFactory= StandaloneFactory;
到
var stdFac:StandaloneFactory.type= StandaloneFactory;
或
var stdFac= StandaloneFactory;
代码编译并成功运行。 我认为它与scala中的别名有关。我没有得到正在发生的事情。请帮我理解这一点。
感谢。
答案 0 :(得分:2)
作为对象,StandaloneFactory
是值,而不是类型。它是某种类型的唯一实例,其名称对您来说并不明显,但可以StandaloneFactory.type
的形式提供。生成类型的名称,目前通过向对象名称添加$
- 在本例中为StandaloneFactory$
。编译完成后,您将看到这样的类文件。
您要求提供参考,说明object StandaloneFactory
创建的值StandaloneFactory
而不是该名称的类型。请参阅Scala语言规范中this page的底部,其中创建了一个名为Point
的类和一个对象,并显示
类定义在类型名称空间中定义名称Point, 而对象定义在术语名称空间中定义了一个名称。
讨论了两个名称空间here。 "类型命名空间"用于引用类型的符号,以及" term namespace"用于引用类型的 实例 的符号。
当你说时,这里要说清楚
object StandaloneFactory
您创建了一个类型(其名称为StandaloneFactory$
,而不是StandaloneFactory
)和一个值StandaloneFactory
(指向StandaloneFactory$
的唯一实例) 。您可能会感到惊讶的是,值StandaloneFactory
并未指向类型StandaloneFactory
的实例,但如果您了解伴随对象和案例类,您将意识到类型的伴随对象是完全的不同类型的动物;它必须有自己的类型。