簡體   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