在Scala中通过匿名类设置私有var?

时间:2015-06-02 16:10:38

标签: scala generics abstract-class mixins

我在Odersky的论文(第2.1章)中找到了一个关于抽象类型成员的例子:http://lampwww.epfl.ch/~odersky/papers/ScalableComponent.pdf

enter image description here

我将其粘贴在

下面
abstract class AbsCell {
  type T
  val init: T
  private var value: T = init
  def get: T = value
  def set(x:T):Unit = {value = x}
}


val cell = new AbsCell{ type T=Int; val init=1}
cell.set(cell.get + 1)
cell.get

最新的Scala(Scala版本:2.11)中的代码无法正常工作。

我发现最后一个表达式cell.get的值是1,而我所期望的是2.原因是private var value: T = init对于mixin匿名类{{1}不起作用}。

有没有人对此有任何想法?

1 个答案:

答案 0 :(得分:0)

您的代码无效,因为valueval init 之前已初始化。因此,在初始化value时,init仍然等于T类型的默认值,T = Int为0。

您可以通过init deflazy val来解决此问题。

请注意,您引用的论文没有您提及的代码。在论文中,initGenCell / AbsCell的构造函数的参数,因此在value之前正确初始化。