元素的地图与可变泛型

时间:2015-08-31 23:55:22

标签: scala generics dictionary

Java How to declare a map with variable generics?

存在这个问题

我有完全相同的问题。 是否有更好的/ Scala解决方法?

编辑: 我尝试按照上面的答案,但没有实现内部地图。

private class SectionConversionMap
  extends HashMap[SectionSchema[_], (Iterable[HtmlRow]) => Option[Iterable[_]]]
{
  override def +[T, B1 >: ( Iterable[HtmlRow] ) =>
    Option[Iterable[T]]](kv: (SectionSchema[T], B1)):
  HashMap[SectionSchema[_], B1] = {
    val m = super.+(kv)
    m
  }
}

但是我的IDE一直坚持这样做 Expression of type HashMap[SectionSchema[_], Any] doesn't conform to expected type HashMap[SectionSchema[_], B1]

2 个答案:

答案 0 :(得分:3)

不要扩展标准的收款类型,除非你非常了解自己在做什么,否则它只是在寻找麻烦。在这种情况下,编译器将确保所有方法签名至少与以前一样通用,并且+不是(请注意,在Binzi Cao的回答中它并没有覆盖任何东西! )。只需关注来源并将Map保留在字段中即可。

答案 1 :(得分:1)

这是一个简单的例子,也许它可以给你一些提示:

import scala.collection.mutable._
class MyMap extends HashMap[Any, List[Any]] {
  def put[T, B <% T](key: T, value: List[B]) = {
    this += key -> value
  }
}
val b = new MyMap()
b.put("q", List("q"))
b.put(12, List(12))
b.put(122, List("23")) //not compile

最后一行不会编译:

No implicit view available from String => Int.    

看起来你想要使用标准的scala lib函数,但是,我想,如果要进行覆盖,则无法更改方法返回类型。以下是scala Map Method

@migration("`+` creates a new map. Use `+=` to add an element to this map and return that map itself.", "2.8.0")
  def + [B1 >: B] (kv: (A, B1)): Map[A, B1] = clone().asInstanceOf[Map[A, B1]] += kv

我在你的代码中做了类似的事情,它现在可以编译,希望它是你需要的或给你一些线索:

import scala.collection.mutable._
type HtmlRow = String
type SectionSchema[T] = List[T]
private class SectionConversionMap extends HashMap[SectionSchema[_], (Iterable[_]) => Option[Iterable[_]]] {
   def +[T, B1 >: ( Iterable[HtmlRow] ) => Option[Iterable[T]]](kv: (SectionSchema[T], B1)):
       HashMap[SectionSchema[_], B1] = { 
         val m =  clone().asInstanceOf[HashMap[SectionSchema[_], B1]]
         m+=kv
       }   
}