Я столкнулся с некоторым поведением Scala, которое не могу объяснить.
Допустим, у нас перегруженный метод.
def foo = List('a','b','c') //NoArgFoo
def foo(x: Int*) = List('X','Y','Z') //VarArgsFoo
[ Примечание : порядок не имеет значения, но они должны быть в одной единице компиляции. Как две отдельные строки в REPL, одна будет просто затенять другую.]
Теперь давайте попробуем несколько различных способов вызова метода / ов.
foo //res0: List[Char] = List(a, b, c) <--NoArgFoo
foo() //res1: List[Char] = List(X, Y, Z) <--VarArgsFoo
foo(1) //res2: Char = b <--NoArgFoo.apply(1)
foo(1, 2) //res3: List[Char] = List(X, Y, Z) <--VarArgsFoo
Теперь давайте изменим foo
наберите String
, который также имеет метод apply()
.
foo //res0: String = ABC <--NoArgFoo
foo() //res1: String = xyz <--VarArgsFoo
foo(1) //res2: String = xyz <--VarArgsFoo
foo(1, 2) //res3: String = xyz <--VarArgsFoo
Это казалось странным, пока я не вспомнил, что apply()
не является родным для java.lang.String
. Он доступен через неявное преобразование, и поскольку компилятор не будет вызывать неявное, если это не нужно, этот результат имеет смысл. Но теперь у нас противоречивое поведение.
Итак, является ли приоритет apply()
над varargs ошибкой или функцией? Является ли это просто результатом какого-то произвольного / капризного выбора, сделанного авторами компилятора? Является ли это неизбежным следствием механизма varargs?