Lambda Conversion Exception using records

Francois Green francois.green at gmail.com
Mon Oct 8 01:17:07 UTC 2018


While experimenting with the amber-demo (thank you Aleksey Shipilev!), I
came across an exception with this code:

> import java.util.stream.Stream;
>
> public class Shades {
>
> static String shade(Blue b) -> switch (b) {
> case Azure a-> a.shade;
> case Royal r -> r.shade;
> case IKB i -> i.shade;
> default -> "None";
> }
>
> public static void main(String[] args) {
> var colors = Stream.of(new Royal("Medium"), new IKB("Dark"), new Azure(
> "Light"));
> colors.map(Shades::shade).forEach(System.out::println);
> }
> }
>
> interface Blue;
>
> record Royal(String shade) implements Blue;
> record IKB(String shade) implements Blue;
> record Azure(String shade) implements Blue;
>



> Exception in thread "main" java.lang.BootstrapMethodError: bootstrap
> method initialization exception
>         at
> java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:194)
>         at java.base/java.lang.invoke.CallSite.makeSite(CallSite.java:307)
>         at
> java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:258)
>         at
> java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:248)
>         at Shades.main(Shades.java:14)
> Caused by: java.lang.invoke.LambdaConversionException: Type mismatch for
> lambda argument 0: class java.lang.AbstractRecord is not convertible to
> interface Blue
>         at
> java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:279)
>         at
> java.base/java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:328)
>         at
> java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:127)
>         at java.base/java.lang.invoke.CallSite.makeSite(CallSite.java:307)
>         at
> java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:258)
>         at
> java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:248)
>         at Shades.main(Shades.java:14)
>         at
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
> Method)
>         at
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>         at
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>         at
> jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:415)
>         at
> jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
>         at
> jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
>

The program works if the colors are changed to classes or by adding a type
parameter to the shade method.


More information about the amber-dev mailing list