【问题标题】:Set a private var by an anonymous class in Scala?通过Scala中的匿名类设置私有变量?
【发布时间】:2015-06-02 16:10:38
【问题描述】:

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


我把它贴在下面

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匿名类{ type T=Int; val init=1}

有人对此有任何想法吗?

【问题讨论】:

  • 这个问题没有mixins。这是一个普通的匿名类。另外,我不会放 Java 标记。

标签: scala generics abstract-class mixins


【解决方案1】:

您的代码不起作用,因为valueval init 之前被初始化。所以在value初始化的时候,init仍然等于T类型的默认值,即T = Int为0。

您可以通过将init 设置为deflazy val 来解决此问题。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多