使用Scala的ObservableMap [英] Using Scala's ObservableMap
问题描述
我正在尝试使用scala.collection.mutable.ObservableMap.
I'm trying to use scala.collection.mutable.ObservableMap.
我从scala用户中抓到了 下面的代码段,然后将其复制到REPL.
I grabbed the snippet below from scala-user and copied it to the REPL.
电子邮件中提到票证2704,该票证已标记为已修复",但此代码段无效.
The email mentions ticket 2704 which has been marked as fixed but this snippet does not work.
那么语法是否已更改或预订被错误地调用?
So has the syntax changed or is subscribe being called incorrectly?
这是在2.9.0.final上
This is on 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)
推荐答案
此处的问题是MyMap没有优化Pub类型,因此MyMap需要Subscriber[Message[(Int, Int)] with Undoable, ObservableMap[Int, Int]]
,而您的订阅者类型为Subscriber[Message[(Int, Int)] with Undoable, MyMap]
.有两个选项-要么更改您的订户,以使Pub
类型为ObservableMap[Int, Int]
:
The problem here is that MyMap isn't refining the Pub type, so MyMap wants a Subscriber[Message[(Int, Int)] with Undoable, ObservableMap[Int, Int]]
and your subscriber type is Subscriber[Message[(Int, Int)] with Undoable, MyMap]
. There are two options -- either change your subscriber so that the Pub
type is 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以覆盖发布类型:
or, change MyMap to override the Pub type:
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
这篇关于使用Scala的ObservableMap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!