scala中的泛型添加

时间:2016-01-15 21:21:43

标签: scala generics

class Calculator[A:Numeric]{

  var x:A = _;

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

}

编译错误:

  1. 无法解析A
  2. 上的+符号
  3. 类型不匹配; expected:String,actual:A

2 个答案:

答案 0 :(得分:4)

class Calculator[A: Numeric]{ ... }

的语法糖
class Calculator[A](implicit n: Numeric[A]){ ... }

如果你查看the docs for Numeric,你会发现使用“丰富我的资源库”模式的implicit def mkOrderingOps+等数学运算符添加到A类型。< / p>

您需要从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
}

答案 1 :(得分:2)

您需要导入数字操作:

  class Calculator[A : Numeric] {
    val numeric = implicitly[Numeric[A]]
    import numeric._

    var x: A = _
    def sum(): A = x + x
  }

相当于:

  class Calculator[A](implicit numeric: Numeric[A]) {
    import numeric._

    var x: A = _
    def sum(): A = x + x
  }