наблюдаемая карта в Scala - PullRequest
1 голос
/ 27 июля 2011

Я новичок в скале.Я хочу получать уведомления всякий раз, когда карта модифицируется.Я думал, что это можно сделать с помощью наблюдаемой карты.

Я пытаюсь определить объект, как показано ниже

var myObj = new Map[UUID, MyType] with ObservableMap[UUID,MyType]

, но он не компилируется, говоря:1008 * почему это так?Как создать экземпляр ObservableMap?

Ответы [ 3 ]

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

Вам нужно смешать ObservableMap с конкретным типом карты.

scala> import scala.collection.mutable._
import scala.collection.mutable._

scala> val map = new HashMap[Int, Int] with ObservableMap[Int, Int]
map: scala.collection.mutable.HashMap[Int,Int] with scala.collection.mutable.ObservableMap[Int,Int] = Map()
1 голос
/ 27 июля 2011

Map - это объект, у которого есть метод apply, который создает новый экземпляр карты, поэтому вы можете делать такие вещи, как val mymap = Map(). Но карта, которую вы используете, является особенностью, которая содержит некоторые абстрактные методы, которые вам нужно реализовать. Поскольку и Map, и ObservableMap имеют абстрактные элементы, это не работает.

(я вижу, что кто-то ответил тем, что я собирался сказать, когда я печатал - Гаррет прав, вам нужно смешать это с конкретным шрифтом)

Альтернативой может быть создание MapProxy вокруг карты, которую вы хотите наблюдать, и смешивание ObservableMap с этим.

1 голос
/ 27 июля 2011

Некоторые из методов в признаке ObseravableMap являются абстрактными, что означает, что вы должны предоставить их реализации.Вот ссылка на API.

Ваш код должен выглядеть примерно так:

val myObj = new Map[UUID, MyType] with ObservableMap[UUID, MyType] {
   def get (key: A): Option[B] = // your implementation here
   def iterator : Iterator[(A, B)] = // your implementation here
}
...