Scala中的结构化键入不适用于Double?

时间:2012-10-04 04:49:29

标签: scala

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

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)

我的代码有问题吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:9)

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

def sum[E:Numeric](e:E) = {
  val n = implicitly[Numeric[E]]
  n.toDouble(e) * 2
}