无法弄清楚泛型中的某些东西

时间:2015-02-10 19:56:18

标签: scala

我对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的要求。

提前致谢!

1 个答案:

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