This bug was reported in compiler-dev list
https://mail.openjdk.org/pipermail/compiler-dev/2022-August/020312.html
File Bug.java
import java.util.function.BiFunction;
public class Bug {
sealed interface Term {
record Lit() implements Term {}
record Lam(String x, Term a) implements Term {}
}
public static <X, T> void call(BiFunction<X, T, T> op, X x, T t) {
op.apply(x, t);
}
public static void main(String[] args) {
// this code works
call(Term.Lam::new, "x", (Term) new Term.Lit());
// this does not
call(Term.Lam::new, "x", new Term.Lit());
// java.lang.invoke.LambdaConversionException: Type mismatch for lambda argument 1:
// class java.lang.Record is not convertible to interface Term
}
}
$ java Bug
Exception in thread "main" java.lang.BootstrapMethodError: bootstrap method initialization exception
at java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:188)
at java.base/java.lang.invoke.CallSite.makeSite(CallSite.java:315)
at java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:279)
at java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:269)
at Bug.main(Bug.java:18)
Caused by: java.lang.invoke.LambdaConversionException: Type mismatch for lambda argument 1: class java.lang.Record is not convertible to interface Bug$Term
at java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:298)
at java.base/java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:340)
at java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:134)
... 4 more
https://mail.openjdk.org/pipermail/compiler-dev/2022-August/020312.html
File Bug.java
import java.util.function.BiFunction;
public class Bug {
sealed interface Term {
record Lit() implements Term {}
record Lam(String x, Term a) implements Term {}
}
public static <X, T> void call(BiFunction<X, T, T> op, X x, T t) {
op.apply(x, t);
}
public static void main(String[] args) {
// this code works
call(Term.Lam::new, "x", (Term) new Term.Lit());
// this does not
call(Term.Lam::new, "x", new Term.Lit());
// java.lang.invoke.LambdaConversionException: Type mismatch for lambda argument 1:
// class java.lang.Record is not convertible to interface Term
}
}
$ java Bug
Exception in thread "main" java.lang.BootstrapMethodError: bootstrap method initialization exception
at java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:188)
at java.base/java.lang.invoke.CallSite.makeSite(CallSite.java:315)
at java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:279)
at java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:269)
at Bug.main(Bug.java:18)
Caused by: java.lang.invoke.LambdaConversionException: Type mismatch for lambda argument 1: class java.lang.Record is not convertible to interface Bug$Term
at java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:298)
at java.base/java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:340)
at java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:134)
... 4 more