繁体   English   中英

MultiMap的非法继承

[英]Illegal Inheritance with MultiMap

我想创建一个MultiMap,它具有一个用于键的类和一个用于值的ListBuffer。

我想添加多个对象,将游戏对象扩展到地图中。 然后使用键检索一组对象。

游戏对象

class GameObject {

}

员工

Staff extends GameObject {

}

顾客

Customer extends GameObject {

}

// Staff extends GameObject
val staffMembers = ListBuffer[Staff](/* Add Elements*/)

// Customer extends GameObject
val customers = ListBuffer[Customer](/* Add Elements*/)

val map = new mutable.HashMap[Class[_ <: GameObject], mutable.ListBuffer[GameObject]]() with mutable.MultiMap[Class[_ <: GameObject], GameObject]

staffMembers.foreach(staff=> map.addBinding(classOf[Staff], staff))
customers.foreach(customer=> map.addBinding(classOf[Customer], customer))

错误

Error:(34, 19) illegal inheritance;
<$anon: Class[_ <: com.casinogame.gameobject.GameObject] => 
scala.collection.mutable.ListBuffer[com.casinogame.gameobject.GameObject] with Class[_ <: com.casinogame.gameobject.GameObject] => 
scala.collection.mutable.Set[com.casinogame.gameobject.GameObject]> inherits different type instances of trait Map:
scala.collection.mutable.Map[Class[_ <: com.casinogame.gameobject.GameObject],scala.collection.mutable.Set[com.casinogame.gameobject.GameObject]] and scala.collection.mutable.Map[Class[_ <: com.casinogame.gameobject.GameObject],scala.collection.mutable.ListBuffer[com.casinogame.gameobject.GameObject]]
val map = new mutable.HashMap[Class[_ <: GameObject], mutable.ListBuffer[GameObject]]() with mutable.MultiMap[Class[_ <: GameObject], GameObject]

正确的做法是什么?

如果您更仔细地阅读文档,并使用普通的可变Set替换嵌套的ListBuffer ,则可以正常编译:

import collection.mutable.ListBuffer
import collection.mutable.{Set, MultiMap, HashMap}

class GameObject {

}

class Staff extends GameObject {

}

class Customer extends GameObject {

}

// Staff extends GameObject
val staffMembers = ListBuffer[Staff](new Staff)

// Customer extends GameObject
val customers = ListBuffer[Customer](new Customer)

val map = 
  new HashMap[Class[_ <: GameObject], Set[GameObject]] 
  with MultiMap[Class[_ <: GameObject], GameObject]

staffMembers.foreach(staff=> map.addBinding(classOf[Staff], staff))
customers.foreach(customer=> map.addBinding(classOf[Customer], customer))

话虽如此,我认为以下代码片段更接近您的初衷:

val map2 = HashMap.empty[Class[_ <: GameObject], ListBuffer[GameObject]]

for (s <- staffMembers) {
  map2.getOrElseUpdate(classOf[Staff], ListBuffer.empty) += s
}
for (c <- customers) {
  map2.getOrElseUpdate(classOf[Customer], ListBuffer.empty) += c
}

如果将它包装到CasinoBuilder中,并且在构造Casino后不让可变状态在所有方向上逸出,它甚至可能被认为是惯用的。

我不确定为什么需要MultiMap ,但是这将创建一个简单的HashMap来将类映射到值:

val map = HashMap(List(
  classOf[Staff] -> staffMembers,
  classOf[Customer] -> customers
):_*)

如果在编译时固定了一组类,这也允许您使用不可变的Map

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM