import java.lang.invoke.*; import java.util.Arrays; interface MyFunctionalInterfaceVarargs { Object invokeMethodReference(Object... args) throws Throwable; } interface MyFunctionalInterfaceArity3 { Object invokeMethodReference(Object a, Object b, Object c) throws Throwable; } public class Test { public Object m(Object ... args) { System.out.println("m: " + Arrays.toString(args)); return "m"; } public static void main(String argv[]) throws Throwable { MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodType mt = MethodType.methodType(String.class, char.class, char.class); MethodHandle ms = lookup.findVirtual(String.class, "replace", mt); System.out.println("result: " + ms.invoke("some string to search", 's', 'o')); MyFunctionalInterfaceVarargs methodRefSimple = new Test()::m; methodRefSimple.invokeMethodReference("first", "second"); Object res; MyFunctionalInterfaceVarargs methodRefSignPoly = ms::invoke; try { res = methodRefSignPoly.invokeMethodReference("some string to search", 's', 'o'); } catch (Throwable ex) { res = ex; } assert(res instanceof WrongMethodTypeException); System.out.println(res); // WrongMethodTypeException: cannot convert MethodHandle(String,char,char)String to (Object[])Object MyFunctionalInterfaceArity3 methodRefSignPolyArity3 = ms::invoke; res = methodRefSignPolyArity3.invokeMethodReference("some string to search", 's', 'o'); assert(res.equals("oome otring to oearch")); System.out.println(res); } } /* result: oome otring to oearch m: [first, second] java.lang.invoke.WrongMethodTypeException: cannot convert MethodHandle(String,char,char)String to (Object[])Object Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception at java.lang.invoke.CallSite.makeSite(CallSite.java:328) at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:296) at Test.main(Test.java:40) Caused by: java.lang.invoke.LambdaConversionException: Incorrect number of parameters for instance method invokeVirtual java.lang.invoke.MethodHandle.invoke:(Object[])Object; 1 captured parameters, 3 functional interface method parameters, 1 implementation parameters at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:188) at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303) at java.lang.invoke.CallSite.makeSite(CallSite.java:289) ... 2 more */