Применить () приоритет над вызовом varargs - PullRequest
4 голосов
/ 03 апреля 2020

Я столкнулся с некоторым поведением 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?

...