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