Использование Scala в ObservableMap - PullRequest
3 голосов
/ 09 июля 2011

Я пытаюсь использовать 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)

1 Ответ

5 голосов
/ 09 июля 2011

Проблема здесь в том, что MyMap не уточняет тип Pub, поэтому MyMap хочет Subscriber[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, чтобы переопределить тип публикации:

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
...