Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala中的可观测映射_Scala_Scala Collections - Fatal编程技术网

scala中的可观测映射

scala中的可观测映射,scala,scala-collections,Scala,Scala Collections,我是斯卡拉的新手。我想在地图被修改时得到通知。我认为这可以用一张可观察的地图来完成 我试图定义一个如下所示的对象 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, MyTy

我是斯卡拉的新手。我想在地图被修改时得到通知。我认为这可以用一张可观察的地图来完成

我试图定义一个如下所示的对象

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

为什么会这样?如何实例化ObserverMap?

trait 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
}

trait 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
}

您需要将
observateMap
与具体的映射类型混合在一起

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()

您需要将
observateMap
与具体的映射类型混合在一起

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()

Map
是一个具有apply方法的对象,该方法创建一个新的Map实例,这就是为什么您可以执行类似于
val mymap=Map()
的操作。但是您使用的映射是一种特性,它有一些抽象的方法需要实现。因为
Map
observateMap
都有抽象元素,所以它不起作用

(我看到有人回答了我要说的话,因为我正在打字——加勒特是对的,你需要把它和一个具体的字体混合在一起)


另一种方法是围绕要观察的地图创建一个
MapProxy
,并将
ObservableMap
与之混合。

map
是一个对象,该对象具有一个创建新地图实例的apply方法,这就是为什么您可以执行类似
val mymap=map()
的操作。但是您使用的映射是一种特性,它有一些抽象的方法需要实现。因为
Map
observateMap
都有抽象元素,所以它不起作用

(我看到有人回答了我要说的话,因为我正在打字——加勒特是对的,你需要把它和一个具体的字体混合在一起)


另一种方法是围绕要观察的地图创建一个
MapProxy
,并将
ObservableMap
与之混合。

这是一个特性,用于混合。比如:

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

然而,自从scala_2.11以来,它就被弃用了

这是一种特性,可以作为一种混入物使用。比如:

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

然而,自从scala_2.11以来,它就被弃用了

但是我认为get和迭代器应该是所有映射的通用工具。为什么每个人都应该提供自己的实现这是正确的,但是您正在实例化一个
映射,这本身就是一个特性。如果希望为您提供
get
iterator
的实现,则需要实例化一个特定的映射,比如一个
HashMap
。好吧,你先到了。我已经接受了你的答案。但是我认为get和iterator应该是所有映射的通用工具。为什么每个人都应该提供自己的实现呢这是正确的,但是你正在实例化一个
映射,这本身就是一个特性。如果希望为您提供
get
iterator
的实现,则需要实例化一个特定的映射,比如一个
HashMap
。好的,你先到了。我已经接受了你的答案。thxOK。那可能很愚蠢。我应该把它声明为HashMap。好的。那可能很愚蠢。我应该把它声明为HashMap。。