javac doesn't generate the correct bytecode for lambda if the target type is an intersection type
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Thu Nov 5 09:47:59 UTC 2015
Thanks for the report - looks an interesting issue; I also note that a
MethodHandle.asType adaptation would have solved this issue?
Maurizio
On 05/11/15 09:37, Remi Forax wrote:
> About this bug,
> https://bugs.openjdk.java.net/browse/JDK-8141508
>
> javac has trouble with intersection type that are target type of a lambda and method reference,
> Usually when there is an intersection type, javac substitute it by the first type of the intersection type and add cast when necessary.
>
> Let suppose we have this code,
>
> public class Intersection {
> interface I {
> }
> interface J {
> void foo();
> }
>
> static <T extends I & J> void bar(T t) {
> Runnable r = t::foo;
> }
>
> public static void main(String[] args) {
> class A implements I, J { public void foo() {} }
> bar(new A());
> }
> }
>
>
> Currently, javac generates a method reference on J::foo with an invokedynamic that takes an I as parameter, hence it fails at runtime.
> javac should de-sugar t::foo into a lambda that take an I and then add a cast to J like for a call to a method of an intersection type.
>
> So the workaround is to use a lambda instead,
> Runnable r = t -> t.foo();
>
> I've already seen this bug somewhere but was not able to find a corresponding bug report in the database :(
>
> cheers,
> Rémi
>
>
More information about the compiler-dev
mailing list