Skip to content

Compiler: Generic method overloading via implicit class #11810

Closed
@REASY

Description

@REASY

When I try to create an extension for the class via implicit class and overload existing generic method, it fails with compilation error:

error: overloaded method value getAs with alternatives:
  (fieldName: String)String <and>
  (i: Int)String
 cannot be applied to (FooField.type)
       r.getAs[String](FooField)

While overloading normal (non-generic) method via implicit works fine. Tried on Scala 2.12.10. Link to scastie. What am I missing? Code:

trait Row {
    // Two overloads for `getAs[T]`
    def getAs[T](i: Int): T
    def getAs[T](fieldName: String): T

    // Two overloads for `get`
    def get(i: Int): String
    def get(fieldName: String): String
}

trait Field {
    def columnName: String
    def columnDescription: String
}
case object FooField extends Field {
    def columnName: String = "Foo"
  def columnDescription: String = "Foo desc"
}

object Implicits {
  implicit class RowEx(val r: Row) extends AnyVal {
    def getAs[T](field: Field): T = r.getAs[T](field.columnName)
    def get(field: Field): String = {
      println(s"RowEx.get: field")
      r.get(field.columnName)
    }
  }
}

object Main {
  import Implicits._
  // Create some instance of `Row`
  val r = new Row {
    def getAs[T](i: Int): T = i.toString.asInstanceOf[T]
    def getAs[T](fieldName: String): T = fieldName.toString.asInstanceOf[T]
    def get(i: Int): String = i.toString
    def get(fieldName: String): String = fieldName
  }

  def main(args: Array[String]): Unit = {
    // Call extension method => `RowEx.get`
    println(r.get(FooField))

    // Call extension method => `RowEx.get`
    // Won't compile with compilation error:
    /*
    overloaded method value getAs with alternatives:
      (fieldName: String)String 
      (i: Int)String
     cannot be applied to (FooField.type)
    */
    println(r.getAs[String](FooField))
  }
}

Originally I created a question in StackOverflow

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions