繁体   English   中英

深度Scala-现有类型

[英]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接受为异常的正确类型。

在特征DependenciesaddHandle的定义如下:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM