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

Mau*_*abo 11 scala

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

def sum(e: { def *(x: Double): Double}) = e * 2.0
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

我的代码有问题吗?

kmi*_*izu 14

Scala的结构类型不需要AnyRef.

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

def sum(e: { def *(x: Double): Double }) = e * 2.0
Run Code Online (Sandbox Code Playgroud)

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

def sum(e: AnyRef { def *(x: Double): Double}) = e * 2.0
Run Code Online (Sandbox Code Playgroud)

如果明确指定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
Run Code Online (Sandbox Code Playgroud)


Kim*_*bel 9

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

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