我在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匿名类{{1}不起作用}。
有没有人对此有任何想法?
答案 0 :(得分:0)
您的代码无效,因为value
在val init
之前已初始化。因此,在初始化value
时,init
仍然等于T
类型的默认值,T = Int
为0。
您可以通过init
def
或lazy val
来解决此问题。
请注意,您引用的论文没有您提及的代码。在论文中,init
是GenCell
/ AbsCell
的构造函数的参数,因此在value
之前正确初始化。