Scala深度 - 存在类型

时间:2014-03-09 13:21:50

标签: scala 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的句柄(如果我做对了)所以值t应该被接受为异常的正确类型。

1 个答案:

答案 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)
}  

也许其他人对此有一些了解。