我目前正在深入阅读Scala,并且我对存在类型的观点感到困惑。
使用openjdk 7和scala 2.10.3
以下说明给我一个错误:
val x = new VariableStore[Int](12)
val d = new Dependencies {}
val t = x.observe(println)
d.addHandle(t)
<console>:14: error: method addHandle in trait Dependencies cannot be accessed in types.Dependencies
Access to protected method addHandle not permitted because
enclosing object $iw is not a subclass of
trait Dependencies in package types where target is defined
d.addHandle(t)
^
我无法找出原因以及如何解决这个错误。
编辑1: 我在Kihyo的回答中添加了以下代码:
class MyDependencies extends Dependencies {
override def addHandle(handle: Ref) = super.addHandle(handle)
}
val x = new VariableStore[Int](12)
val d = new MyDependencies
val t = x.observe(println)
d.addHandle(t) //compiles
它使addHandle公开而不是受保护。
现在我有以下错误消息:
type mismatch; found : x.Handle (which expands to) x.HandleClass required: d.Ref (which
expands to) x.Handle forSome { val x: sid.types.obs.Observable }
HandleClass是一个Handle,Ref是任何Observer的句柄(如果我做对了)所以值t应该被接受为异常的正确类型。
答案 0 :(得分:1)
在特征Dependencies
中,addHandle
的定义如下:
protected def addHandle(handle : Ref) : Unit
protected
表示只有子类可以访问此方法,这就是您收到错误的原因。 (这基本上可以告诉你)
当您创建使addHandle
公开的子类时,您的代码可以正常工作:
class MyDependencies extends Dependencies {
override def addHandle(handle: Ref) = super.addHandle(handle)
}
val x = new VariableStore[Int](12)
val d = new MyDependencies
val t = x.observe(println)
d.addHandle(t) //compiles
但我不知道这个例子以及你想用它做什么。
@ EDIT1:
我得到了和你一样的错误,但我无法解释原因。当我扩展App而不是使用main方法时,它对我有用:
object TestObs extends App {
val x = new VariableStore[Int](12)
val d = new MyDependencies
val t = x.observe(println)
d.addHandle(t)
}
也许其他人对此有一些了解。