2016-01-15 57 views
1
class Calculator[A:Numeric]{ 

    var x:A = _; 

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

} 

编译器错误:泛型在斯卡拉此外

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

回答

2

需要导入数字OPS:

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 
    } 
4
class Calculator[A: Numeric]{ ... } 

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

如果您在the docs for Numeric中查找,您会发现implicit def mkOrderingOps,它使用“Enrich my Library”模式将+等数学运算符添加到A类型中。

您需要从Numeric的实例导入mkOrderingOps

保留您当前的班级签名,您可以使用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 
}