我对scala很新,我来自Obj-C,所以我对泛型不是很熟悉。这就是我正在做的事情:
class A[T <: Word](rules: Map[T, T]) {
def this(rulesStr: Map[String, String], i:Int) = {
this(rulesStr map { case (k, v) => (new W(k), new W(v))})
}
}
所以,我试图重新制作我的地图,从(字符串,字符串)到(W,W)。 W是具有底层String的类,并扩展Word。这是它的定义
class W(val underlying: String) extends Word
我收到错误:
Error:(6, 19) type mismatch;
found : scala.collection.immutable.Map[W,W]
required: Map[T,T]
this(rulesStr map { case (k, v) => (new W(k), new W(v))})
^
我无法弄清楚,我做错了什么,因为W继承了Word,并且符合T的要求。
提前致谢!
答案 0 :(得分:2)
问题是,对于客户选择的任何Map[T, T]
,您需要T
,这是您构建Map[W, W]
时无法做到的。例如,如果某人定义了
case class OtherWord(s: String) extends Word
然后他们应该可以使用A
,因为OtherWord
满足T
的约束:
val a = A[OtherWord](...)
在这种情况下,您将传递Map[Word, Word]
,其中Map[OtherWord, OtherWord]
是必需的。
您可以删除类型参数:
class A(rules: Map[W, W]) {
def this(rulesStr: Map[String, String], i:Int) = {
this(rulesStr map { case (k, v) => (new W(k), new W(v))})
}
}
或要求在构造函数中提供String => T
函数
class A[T <: Word](rules: Map[T, T]) {
def this(rulesStr: Map[String, String], i:Int, f: String => T) = {
this(rulesStr map { case (k, v) => (f(k), f(v))})
}
}