2013-05-06 62 views
1

为什么当我启动没有new关键字的案例类实例时,我无法访问普通类中的case类方法? 也就是说下面的代码我得到一个编译时错误:访问案例类别的方法

case class A() { 
    private var _g = 12 

    //getter-setter 
    def g = _g 
    def g_=(value : Int) = this._g = value 
} 

class B { 
    def someMethod = { 
    val aInstance = A 
    aInstance.g = 4; // compile time error. Why? 
    } 
} 

但是,如果我在aInstance申报所有的工作细加new关键字。

错误消息:

Cannot resolve symbol g

+0

两件事:首先,请给出确切的错误。其次,为什么你会在这种情况下使用案例类? – gzm0 2013-05-06 20:17:58

+0

@ gzm0请查看更新后的问题。我注意到只有在创建case类实例时不使用'new'关键字才会出现编译时错误。关于你的第二个问题:我不知道为什么我不能在这种情况下使用case class,我是Scala的初学者,所以我只写这个代码来训练 – MyTitle 2013-05-06 20:26:14

回答

3

你需要让A类的一个实例与A()(其上A呼吁apply)。否则,你指的是伴侣对象本身。

+0

谢谢,你是对的,现在一切正常。但是为什么你说'你指的是伴侣对象本身'?我没有将任何伴侣对象定义为“案例类A”(即,我没有在同一个源文件中具有名称为“A”的任何“对象”)。这意味着Companion对象总是隐式定义的(除非我明确定义)? – MyTitle 2013-05-06 20:30:57

+0

是的,一个case类总是伴随一个伴侣对象。如果你想添加额外的方法,你可以定义它的明确性,但它总是会有'apply'方法预定义。 – 2013-05-06 22:07:39

0

这个怎么样?您没有定义f,也可能是aInstance

class B { 
    def someMethod = { 
    val aInstance = A 
    aInstance.g = 4 
    } 
} 
+0

这是我的问题中的拼写错误。更新 – MyTitle 2013-05-06 20:19:39