Open
Description
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
Metadata
Metadata
Assignees
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
Jasper-M commentedon Oct 9, 2017
Actually you don't have to try so hard to get to see this beautiful error.
This has always been a feature of overloaded methods.
The explanation probably contains terms like "expected type".
cleishm commentedon Oct 11, 2017
@Jasper-M: you're right, that's a much easier example :)
SethTisue commentedon Jan 12, 2024
works in Scala 3.3.1