Skip to content

Implicit resolution fails for overloaded method with type parameter #9523

Open
@scabug

Description

@scabug

The first example successfully finds the implicit conversion to the method foo(String), however as soon as I add a type parameter (see fails) the compiles doesn't resolve it anymore. Note that my goal is to overload the method foo - if i rename it, the compiler finds it.

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
}

I asked this question already here: http://stackoverflow.com/questions/33162618/why-does-scala-implicit-resolution-fail-for-overloaded-method-with-type-paramete
and got this helpful answer from Alexey Romanov:

Both cases seem to fall under this case of the specification
http://www.scala-lang.org/files/archive/spec/2.11/07-implicit-parameters-and-views.html#views

Views are applied in three situations:
...
In a selection e.m(args) with e of type T, if the selector m denotes some member(s) of T, but none of these members is applicable to the arguments args. In this case a view v is searched which is applicable to e and whose result contains a method m which is applicable to args. The search proceeds as in the case of implicit parameters, where the implicit scope is the one of T. If such a view is found, the selection e.m is converted to v(e).m(args).

So it should work.

Metadata

Metadata

Assignees

No one assigned

    Labels

    fixed in Scala 3This issue does not exist in the Scala 3 compiler (https://github.com/lampepfl/dotty/)has PRimplicittyper

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions