scala中的observablemap

时间:2011-07-27 17:19:42

标签: scala scala-collections

我是scala的新手。我想在修改地图时收到通知。我认为这可以使用可观察的地图来完成。

我正在尝试定义下面的对象

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

但它没有编译说..

error: object creation impossible, since:
method iterator in trait MapLike of type => Iterator[(java.util.UUID, MyType)] is not defined
method get in trait MapLike of type (key: java.util.UUID)Option[MyType] is not defined
method -= in trait ObservableMap of type (key: java.util.UUID)this.type is marked `abstract' and `override', but no concrete implementation could be found in a base class
method += in trait ObservableMap of type (kv: (java.util.UUID, MyType))this.type is marked `abstract' and `override', but no concrete implementation could be found in a base class

为什么会这样?你如何实例化一个ObservableMap?

4 个答案:

答案 0 :(得分:5)

您需要将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 :(得分:1)

特征ObseravableMap中的一些方法是抽象的,这意味着你必须提供它们的实现。以下是API的link

完成后,您的代码看起来应该是这样的:

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
}

答案 2 :(得分:1)

Map是一个对象,它有一个创建新地图实例的apply方法,这就是为什么你可以做val mymap = Map()之类的事情。但是你正在使用的地图是一个特征,它有一些你需要实现的抽象方法。由于MapObservableMap都有抽象元素,因此无效。

(我看到有人回答我要说的话,因为我正在打字 - 加勒特是对的,你需要将它与混凝土类型混合)

另一种方法是在您要观察的地图周围创建MapProxy,然后将ObservableMap与其混合。

答案 3 :(得分:0)

这是特质,意在用作混合。喜欢:

val map = new HashMap[_,_] with ObservableMap[_,_]

但是从scala_2.11开始不推荐使用。