Skip to content

inference fails on overloaded methods despite non-conflicting signature #10542

Open
@cleishm

Description

@cleishm

Asked on StackOverflow: https://stackoverflow.com/questions/46652058/scala-type-inference-fails-on-overloaded-methods-despite-non-conflicting-signatu

% scala                                                                     
Welcome to Scala 2.12.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.

scala>   trait Op[-Y, -Z, +A, +B] {
     |     def apply(other: (Y, Z)): (A, B)
     |   }
defined trait Op

scala>   implicit class RichTuple2[+A, +B](t: (A, B)) {
     |     def ~~~(other: Int): (A, B) = ???
     |     def ~~~[RA, RB](other: Op[A, B, RA, RB]): (RA, RB) = other.apply(t)
     |   }
defined class RichTuple2

scala>   def swap[A, B] = new Op[A, B, B, A] {
     |     override def apply(other: (A, B)) = (other._2, other._1)
     |   }
swap: [A, B]=> Op[A,B,B,A]

scala> (1, "foo") ~~~ swap
<console>:14: error: overloaded method value ~~~ with alternatives:
  [RA, RB](other: Op[Int,String,RA,RB])(RA, RB) <and>
  (other: Int)(Int, String)
 cannot be applied to (Op[Nothing,Nothing,Nothing,Nothing])
       (1, "foo") ~~~ swap

Removing the unused and non-conflicting method def ~~~(other: Int) results in successful inference and compilation.

Possibly related to #9523

Activity

Jasper-M

Jasper-M commented on Oct 9, 2017

@Jasper-M

Actually you don't have to try so hard to get to see this beautiful error.

scala> object Foo {
     |   def foo(op: Op[Int,String,String,Int]) = op
     |   def foo(i: Int) = i
     | }
defined object Foo

scala> Foo.foo(swap)
<console>:15: error: overloaded method value foo with alternatives:
  (i: Int)Int <and>
  (op: Op[Int,String,String,Int])Op[Int,String,String,Int]
 cannot be applied to (Op[Nothing,Nothing,Nothing,Nothing])
       Foo.foo(swap)
           ^

This has always been a feature of overloaded methods.

The explanation probably contains terms like "expected type".

cleishm

cleishm commented on Oct 11, 2017

@cleishm
Author

@Jasper-M: you're right, that's a much easier example :)

added this to the Backlog milestone on Oct 12, 2020
added
fixed in Scala 3This issue does not exist in the Scala 3 compiler (https://github.com/lampepfl/dotty/)
on Jan 12, 2024
SethTisue

SethTisue commented on Jan 12, 2024

@SethTisue
Member

works in Scala 3.3.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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/)overloading

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @cleishm@SethTisue@Jasper-M

        Issue actions

          inference fails on overloaded methods despite non-conflicting signature · Issue #10542 · scala/bug