使用scala泛型编译问题

时间:2015-02-05 11:58:25

标签: scala generics

object PDJcrCache {
  val cache = new ConcurrentHashMap[String, _ <: PDEntity]()

  def put[A <: PDEntity](elem: A) = {
    cache.put(elem.asInstanceOf[PDEntity].getId, ***elem***)
  }
  def get[A <: PDEntity](id: String): A = {
    cache.get(id).asInstanceOf[A]
  }
  def remove[A <: PDEntity](id: String) = {
    cache.remove(id)
  }
}

我收到编译错误 cache.put(elem.asInstanceOf[PDEntity].getId, ***elem***)。 它说expected _$1, actual A。对这个问题有什么看法吗? 这也是使用Scala泛型的正确方法吗?

1 个答案:

答案 0 :(得分:2)

ConcurrentHashMap[String, _ <: PDEntity]是一个地图,其值类型为&#34;某些未知的子类型为PDEntity&#34;。因此,您无法将elem放入此类地图中,因为A可能与该地图使用的特定子类型的PDEntity的子类型不同。

你可能想要一个ConcurrentHashMap[String, PDEntity],但说实话,你的大多数仿制品看起来都是不必要的 - 如果你只是想存储和检索PDEntity,为什么不把它们保存在那里呢?如果您想要某个特定子类型PDEntity的缓存,那么A应该是类的类型参数,而不是单个方法。你想要实现的是什么?