Why is there no compile error, that addListener
method was called with argument, which is a method reference with an interface NotAnEvent
, which has nothing in common with Event
class?
public class TestClass {
public static void main(String[] args) {
addListener(TestClass::listener1);
addListener(TestClass::listener2);
}
public static <T extends Event> void addListener(Consumer<T> listener) {
}
public static void listener1(ActualEvent event) {
}
public static void listener2(NotAnEvent event) {
}
public static class Event {
}
public static class ActualEvent extends Event {
}
public interface NotAnEvent {
}
}
Code above compiles successfully, at least with Intellij Idea 2020.3 Ultimate and JDK 8 (and with OpenJDK 11 too), but it predictably crashes on launch:
Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
at ru.timeconqueror.TestClass.main(TestClass.java:8)
Caused by: java.lang.invoke.LambdaConversionException: Type mismatch for lambda argument 0: class ru.timeconqueror.TestClass$Event is not convertible to interface ru.timeconqueror.TestClass$NotAnEvent
at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:267)
at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303)
at java.lang.invoke.CallSite.makeSite(CallSite.java:302)
... 3 more