Почему неявное разрешение 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/, но не смог найти нужную проблему.

Другие вопросы по тегам