为什么在这种情况下编译器不使用Numeric.plus?

时间:2020-08-28 04:53:55

标签: scala generics

在通用案例类中(在下面)使用+方法时,我得到一些(在我看来是)奇怪的行为。底部的方法可以正常工作,但是顶部的方法给我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))
}

1 个答案:

答案 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表示法。

相关问题