在通用案例类中(在下面)使用+方法时,我得到一些(在我看来是)奇怪的行为。底部的方法可以正常工作,但是顶部的方法给我addVal-type mismatch; found: DataT, required: String
的错误。
我假设这里发生的是编译器已将this.datum
转换为String,因此想使用String.plus
方法,而我希望它使用Numeric.plus
方法。通常,当出现两个Numeric.plus
实例时,默认情况下将使用Numeric
方法,因此我不确定在这种情况下为什么不使用它。
case class SingleValue[DataT <: Numeric[DataT]] (
datum: DataT,
) {
def addToDatumDoesntWork(addVal: DataT): SingleValue[DataT] = SingleValue[DataT](this.datum + addVal)
def addToDatumWorks(addVal: DataT): SingleValue[DataT] = SingleValue[DataT](this.datum.plus(this.datum, addVal))
}
答案 0 :(得分:3)
您不会像预期的那样调用Numeric
类型类。
case class SingleValue[DataT : Numeric](datum: DataT) {
import Numeric.Implicits._
def addToDatumNowItWorks(addVal: DataT): SingleValue[DataT] =
SingleValue[DataT](this.datum + addVal)
}
也可以通过这种方式完成。 (两者大致相等。)
case class SngleValue[DataT](datum: DataT)(implicit ev :Numeric[DataT]) {
import ev._
def addToDatumNowItWorks(addVal: DataT): SingleValue[DataT] =
SingleValue[DataT](this.datum + addVal)
// or
def addToDatumWorks(addVal: DataT): SingleValue[DataT] =
SingleValue[DataT](ev.plus(this.datum, addVal))
}
这个想法是,您提取“证据”表明适当的隐式存在,然后可以导入所需的infix表示法。