scala 中的泛型用于加法

sru*_*ack 1 generics scala

class Calculator[A:Numeric]{

  var x:A = _;

  def sum() : A = x+x;  //error: 

}
Run Code Online (Sandbox Code Playgroud)

编译器错误:

  1. 无法解析 A 上的 + 符号
  2. 类型不匹配; 预期:字符串,实际:A

Dyl*_*lan 5

class Calculator[A: Numeric]{ ... }
Run Code Online (Sandbox Code Playgroud)

是语法糖

class Calculator[A](implicit n: Numeric[A]){ ... }
Run Code Online (Sandbox Code Playgroud)

如果您查看文档,Numeric您会发现implicit def mkOrderingOps它使用“丰富我的库”模式来向+类型添加数学运算符A

您需要mkOrderingOps从 的实例导入Numeric

保留当前的类签名,您可以用来implicitly[Numeric[A]]获取实例。把它们放在一起,你会得到:

class Calculator[A: Numeric] {
  private val n = implicitly[Numeric[A]]
  import n._ // mkOrderingOps is included here     
  var a: A = _
  def sum = a + a // the + is coming from the mkOrderingOps conversion
}
Run Code Online (Sandbox Code Playgroud)