Look the follow code:
import java.lang.invoke.MethodHandle;public class Demo { interface TFunction<T, R> { R apply(T t) throws Throwable; } public class MyMethodHandle { public final native Object invoke(Object... args) throws Throwable; } public static void main(String[] args) { TFunction<MyMethodHandle, Object> f1 = m -> m.invoke(); TFunction<MyMethodHandle, Object> f2 = MyMethodHandle::invoke; TFunction<MethodHandle, Object> f3 = m -> m.invoke(); TFunction<MethodHandle, Object> f4 = MethodHandle::invoke; // here is line 19 }}
run it(java 8), and I get a exception at f4:
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 x.xxx.Demo.main(Demo.java:19)Caused by: java.lang.invoke.LambdaConversionException: Incorrect number of parameters for instance method invokeVirtual java.lang.invoke.MethodHandle.invoke:(Object)Object; 0 captured parameters, 1 functional interface method parameters, 1 implementation parameters at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:193) at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303) at java.lang.invoke.CallSite.makeSite(CallSite.java:302) ... 3 more
my question is what is the difference between f3 and f4? and why f2 can work but f4 not?
I have no idea, I searched for this but got no answer.