以下はコンパイルされません。
package play
object Stats2 {
def variance(data: Seq[Double], dof: Int = 0): Double = {
println("variance Double direct"); 1.0
}
def variance[T](data:Seq[T], dof: Int = 0)(implicit ex: T => Double): Double = {
println("variance Double extracted"); 1.0
}
}
コンパイラは次のように述べています。
$ scalac erasure2.scala
erasure2.scala:7: error: double definition:
method variance$default$2:[T]=> Int and
method variance$default$2:=> Int at line 4
have same type after erasure: ()Int
def variance[T](data:Seq[T], dof: Int = 0)(implicit ex: T => Double): Double = {
^
one error found
dof :Int = 0をdof: Intに変更すると、サンプルはコンパイルされ、期待どおりに動作します。
コードが有効か無効かでパラメータのデフォルト値の有無が変わるのは醜い。
これが本当に理にかなっている理由の説明は何ですか?