[英]Scala in depth - Existential types
我目前正在深入阅读Scala,并且对存在类型感到困惑。
使用这些来源: https : //github.com/jsuereth/scala-in-depth-source/blob/master/chapter6/existential-types/existential.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的Handle(如果我理解正确的话),因此应将值t接受为异常的正确类型。
在特征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而不是使用主方法时,它对我有用:
object TestObs extends App {
val x = new VariableStore[Int](12)
val d = new MyDependencies
val t = x.observe(println)
d.addHandle(t)
}
也许其他人对此有一些见识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.