Open Odomontois opened 2 years ago
Scala 2 handles this by not generating an invokedynamic lambda in this situation and falling back to an anonymous class instance instead, I guess we should do the same (in https://github.com/lampepfl/dotty/blob/main/compiler/src/dotty/tools/dotc/transform/ExpandSAMs.scala).
@WojciechMazur Do you think you could take this on?
I just ran into this issue.
Here is another minimized example:
trait Adapter[T] extends Function1[T, Unit]
object Example {
def main(args: Array[String]): Unit = {
// In Scala 3 this causes a java.lang.AbstractMethodError
makeAdapter[Integer](123)
}
// Works in Scala 2.12 and 2.13 but generates wrong bytecode for Scala 3
// due to using `(arg: Number) => ()` instead of `(arg: T) => ()`
def makeAdapter[T <: Number]: Adapter[T] = (arg: Number) => ()
Compiler version
3.1.2 and 3.2.0-RC1-bin-20220607-76a0b29-NIGHTLY
Minimized code
Output
Scastie link
https://scastie.scala-lang.org/Odomontois/kzIirdZ1RRaDr1Wm8QN9TA/1