我是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?
答案 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()
之类的事情。但是你正在使用的地图是一个特征,它有一些你需要实现的抽象方法。由于Map
和ObservableMap
都有抽象元素,因此无效。
(我看到有人回答我要说的话,因为我正在打字 - 加勒特是对的,你需要将它与混凝土类型混合)
另一种方法是在您要观察的地图周围创建MapProxy
,然后将ObservableMap
与其混合。
答案 3 :(得分:0)
这是特质,意在用作混合。喜欢:
val map = new HashMap[_,_] with ObservableMap[_,_]
但是从scala_2.11开始不推荐使用。