Ниже не компилируется:Тип стирание с параметрами по умолчанию
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
Если степени свободы: Int = 0 изменяются на степеней свободы: Int, тем пример компилируется и работает как ожидалось.
Кажется уродливым, что наличие или отсутствие значения параметра по умолчанию изменяет, является ли код действительным или нет.
Какое объяснение, почему это действительно имеет смысл?
Первый имеет смысл, так как при перегрузке метода Scala только путем проверки первого аргумента и из-за стирания стилей он одинаковый, следовательно, и ошибка. Выполнение 'dof: Int' очень странно. Я не вижу никаких аргументов в руководстве – Jatin