[英]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.