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 に答える