3

我正在尝试使用 scala.collection.mutable.ObservableMap。

从 scala-user 获取了下面的代码片段并将其复制到 REPL。

该电子邮件提到已标记为已修复的票证 2704,但此代码段不起作用。

那么语法是否发生了变化或订阅被错误地调用了?

这是在 2.9.0.final

scala> import scala.collection.mutable._

import scala.collection.mutable._

scala> import scala.collection.script._
import scala.collection.script._

scala> class MyMap extends HashMap[Int,Int] with ObservableMap[Int,Int,MyMap]
<console>:13: error: wrong number of type arguments for scala.collection.mutable.ObservableMap, should be 2
       class MyMap extends HashMap[Int,Int] with ObservableMap[Int,Int,MyMap]
                                                 ^

scala> class MyMap extends HashMap[Int,Int] with ObservableMap[Int,Int]
defined class MyMap

scala> val map = new MyMap
map: MyMap = Map()

scala> class MySub extends Subscriber[Message[(Int,Int)],MyMap] {
     | def notify(pub: MyMap, evt: Message[(Int,Int)]) { println(evt) }
     | }
defined class MySub

scala> val sub = new MySub
sub: MySub = MySub@49918c8f

scala> map.subscribe(sub)
<console>:18: error: type mismatch;
 found   : MySub
 required: map.Sub
       map.subscribe(sub)
4

1 回答 1

5

这里的问题是 MyMap 没有优化 Pub 类型,所以 MyMap 需要 aSubscriber[Message[(Int, Int)] with Undoable, ObservableMap[Int, Int]]并且您的订阅者类型是Subscriber[Message[(Int, Int)] with Undoable, MyMap]. 有两个选项 - 要么更改您的订阅者,以便Pub类型为ObservableMap[Int, Int]

import scala.collection.mutable._
import scala.collection.script._

class MyMap extends HashMap[Int,Int] with ObservableMap[Int,Int]
val map = new MyMap

class MySub extends Subscriber[Message[(Int,Int)] with Undoable, ObservableMap[Int, Int]] {
  def notify(pub: ObservableMap[Int, Int], evt: Message[(Int,Int)] with Undoable) { println(evt) }
}
val sub = new MySub

map.subscribe(sub)

或者,更改 MyMap 以覆盖 Pub 类型:

import scala.collection.mutable._
import scala.collection.script._

class MyMap extends HashMap[Int,Int] with ObservableMap[Int,Int] {
  type Pub = MyMap
}
val map = new MyMap

class MySub extends Subscriber[Message[(Int,Int)] with Undoable, MyMap] {
  def notify(pub: MyMap, evt: Message[(Int,Int)] with Undoable) { println(evt) }
}
val sub = new MySub
于 2011-07-09T03:15:16.930 回答