11

我正在尝试执行以下代码:

def sum(e: { def *(x: Double): Double}) = e * 2.0

问题是,这不适用于任何数字类:

sum(20.0)
<console>:9: error: type mismatch;
 found   : Double(10.0)
 required: AnyRef{def *(x: Double): Double}
              algo(10.0)

sum(10)
<console>:9: error: type mismatch;
 found   : Int(10)
 required: AnyRef{def *(x: Double): Double}
              algo(10)

我的代码有问题吗?

4

2 回答 2

14

Scala 的结构类型不需要 AnyRef。

当然,以下方法声明不能按预期工作。

def sum(e: { def *(x: Double): Double }) = e * 2.0

原因是上面的代码被解释为如下:

def sum(e: AnyRef { def *(x: Double): Double}) = e * 2.0

如果您明确指定 Any ,则代码有效:

scala> def sum(e: Any { def *(x: Double): Double }) = e * 2.0
sum: (e: Any{def *(x: Double): Double})Double

scala> sum(10.0)
res0: Double = 20.0
于 2012-10-04T05:50:16.417 回答
9

您的sum方法需要AnyRef的子类型,而Double和其他数字类型是AnyVal的子类型。相反,您应该做的是使用Numeric类型类。

def sum[E:Numeric](e:E) = {
  val n = implicitly[Numeric[E]]
  n.toDouble(e) * 2
}
于 2012-10-04T05:10:59.027 回答