2008-09-08 47 views
17

Tôi đang cố gắng để mixin các MultiMap đặc điểm với một HashMap như vậy:Multimap trong Scala

val children:MultiMap[Integer, TreeNode] = 
    new HashMap[Integer, Set[TreeNode]] with MultiMap[Integer, TreeNode] 

Định nghĩa cho MultiMap đặc điểm là:

trait MultiMap[A, B] extends Map[A, Set[B]] 

Nghĩa là một MultiMap các loại A & BMap trong số các loại A & Set[B], hoặc có vẻ như vậy đối với tôi. Tuy nhiên, trình biên dịch phàn nàn:

C:\...\TestTreeDataModel.scala:87: error: illegal inheritance; template $anon inherits different type instances of trait Map: scala.collection.mutable.Map[Integer,scala.collection.mutable.Set[package.TreeNode]] and scala.collection.mutable.Map[Integer,Set[package.TreeNode]] 
    new HashMap[Integer, Set[TreeNode]] with MultiMap[Integer, TreeNode] 
    ^one error found 

Có vẻ như generics đang vấp ngã tôi một lần nữa.

Trả lời

26

Tôi phải nhập scala.collection.mutable.Set. Dường như trình biên dịch nghĩ rằng Set trong HashMap[Integer, Set[TreeNode]]scala.collection.Set. Tập hợp trong DefMap đa là scala.collection.mutable.Set.

12

Điều đó có thể gây phiền nhiễu, quá tải tên trong bộ sưu tập của Scala là một trong những điểm yếu lớn của nó.

Đối với những gì nó có giá trị, nếu bạn có scala.collection._ nhập khẩu, bạn có thể có lẽ đã viết loại HashMap của bạn như:

new HashMap[ Integer, mutable.Set[ TreeNode ] ] 
+1

Nó thực sự scala.collection._ :-) – fikovnik

+0

Ngay bạn! Cố định, cảm ơn rất nhiều. – Calum