Lambda Conversion Exception using records
Remi Forax
forax at univ-mlv.fr
Wed Oct 31 11:03:05 UTC 2018
Hi Francois,
it appears it's not a bug specific to records,
see https://bugs.openjdk.java.net/browse/JDK-8213032
I've reported it on your behalf on compiler-dev given it's not specific to records
http://mail.openjdk.java.net/pipermail/compiler-dev/2018-October/012571.html
cheers,
Rémi
----- Mail original -----
> De: "Francois Green" <francois.green at gmail.com>
> À: "amber-dev" <amber-dev at openjdk.java.net>
> Envoyé: Lundi 8 Octobre 2018 03:16:53
> Objet: Lambda Conversion Exception using records
> 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