【问题标题】:Create a var/val of singleton class in scala在 scala 中创建单例类的 var/val
【发布时间】:2015-09-12 23:17:30
【问题描述】:

我创建了一个类:

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 的实例。我只想创建一个 Standalonefactory 的 var/val,所以我尝试这样做:

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 中的别名有关。我不明白发生了什么。请帮助我理解这一点。

谢谢。

【问题讨论】:

    标签: scala singleton


    【解决方案1】:

    作为一个对象,StandaloneFactory 是一个,而不是一个类型。它是某些类型的唯一实例,其名称对您来说并不明显,但可以作为 StandaloneFactory.type 使用。生成类型的名称,目前通过在对象名称中添加$ ——在本例中为StandaloneFactory$。编译后会看到这样一个classfile。

    您要求提供参考说明 object StandaloneFactory 创建一个值 StandaloneFactory 而不是该名称的类型。请参阅 Scala 语言规范中 this page 的底部,其中创建了一个名为 Point 的类和一个对象,上面写着

    类定义在类型命名空间中定义名称Point, 而对象定义在术语命名空间中定义了一个名称。

    here 讨论了这两个命名空间。 “类型命名空间”用于引用类型的符号,“术语命名空间”用于引用类型的实例的符号。

    在这里要清楚,当你说 object StandaloneFactory 您创建了一个类型(其名称是StandaloneFactory$,而不是StandaloneFactory一个值StandaloneFactory(它指向StandaloneFactory$ 的唯一实例)。一开始你可能会惊讶StandaloneFactory 的值并不指向StandaloneFactory 类型的实例,但是如果你了解伴生对象和案例类,你会意识到一个类型的伴生对象是一种完全不同的动物。类型;它必须有自己的自己的类型。

    【讨论】:

    • 请您提供任何参考或链接来解释对象类被创建为value
    • 我只是想澄清一些事情。您要求提供一个链接,说明 object classes 是作为值创建的——好吧,如果“object class”是指对象底层的类,那 not 是一个值.它是一种类型。但是object(不是“object class”)是一个值。
    猜你喜欢
    • 2011-05-25
    • 2018-06-04
    • 1970-01-01
    • 2012-07-08
    • 2020-06-01
    • 1970-01-01
    • 2013-04-25
    • 2020-11-06
    • 2022-10-24
    相关资源
    最近更新 更多