Почему неявное разрешение Scala не удается для перегруженного метода с параметром типа?
Первый пример успешно находит неявное преобразование в метод foo(String)
Однако, как только я добавлю параметр типа (см. fails
) компиляция больше не разрешает это:
object works {
class A {
def foo(): String = ???
}
implicit class PimpedA(a: A) {
def foo(i: String): String = ???
}
val a = new A()
a.foo("test") //compiles
}
object fails { //same as `works`, but adds type parameter
class A {
def foo[T](): String = ???
}
implicit class PimpedA(a: A) {
def foo[T](i: String): String = ???
}
val a = new A()
PimpedA(a).foo("test") // compiles
a.foo("test") // error: too many arguments for method foo: ()String
}
Это поведение одинаково для Scala 2.11.7 и 2.12.0-M3.
Документация по последствиям, кажется, не покрывает это, и я не нашел этого точного случая в stackru.
Обратите внимание, что моя цель - перегрузить метод foo
- если я переименую его, компилятор найдет его.
http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html
1 ответ
Оба случая, кажется, подпадают под этот случай спецификации:
Представления применяются в трех ситуациях:
...
В выборе
e.m(args)
сe
типаT
, если селекторm
обозначает некоторый член (ы) изT
, но ни один из этих членов не применим к аргументамargs
, В этом случае видv
ищется, который применим кe
и чей результат содержит методm
который применим кargs
, Поиск продолжается как в случае неявных параметров, где неявная область видимостиT
, Если такой вид найден, выборe.m
преобразуется вv(e).m(args)
,
Так и должно работать. Я был действительно удивлен, увидев это, потому что я никогда не сталкивался с рабочим случаем раньше и предполагал, что нет неявного поиска, если T
есть ли члены m
, Я быстро взглянул на http://issues.scala-lang.org/, но не смог найти нужную проблему.