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]
答案 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
}
}