2011-07-27 8 views
1

私はscalaを初めて使っています。地図が変更されるたびに通知を受けたい。これは観測可能な地図を使って行うことができると思いました。observablemap in 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

OK..thatはおそらくsilly..Iは –

答えて

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 
} 
+0

... HashMapのようにそれを宣言している必要がありましたが、私はこれが正しい –

+0

誰もが独自の実装を提供する必要があります取得し、イテレータはすべてmaps..whyに共通であるべきと思っていますそれは特性そのものである 'Map'をインスタンス化しています。 'get'と' iterator'の実装をあなたに提供したいなら、例えば 'HashMap'のような特定のマップをインスタンス化する必要があります。 – agilesteel

+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

Mapあなたはval mymap = Map()のようなことを行うことができる理由です新しい地図インスタンスを作成し適用する方法を持つオブジェクトです。しかし、使用しているマップは特性であり、実装する必要があるいくつかの抽象メソッドがあります。 MapObservableMapの両方に抽象要素があるため、機能しません。

代替MapProxyを作成することです(私はtyping-ギャレットが正しいとしたとして、誰かが、私が言うことを約あったものと答えたことがわかり、あなたが具体的な形でそれをミックスする必要があります)あなたが観察したい地図の周りに、ObservableMapを混ぜてください。