如何调用未知类型的lambda

考虑我们有一组变量,这些变量包含对方法的引用:


public double m2(String s, int n){return n;}

Runnable r = ()->{};

Consumer<String> c1 = System.out::println;

BiFunction<String, Integer, Double> f2 = this::m2;

我们可以根据具体变量类型以不同的方式调用它们:


    r.run();

    c1.accept("Hello");

    Object res = f2.apply("Hello", 1);

现在,我需要一个全局方法来调用任何类型的引用方法:


public static Object call(Object lambda, Object... args) {...}

Object res0 = call(r); // returns null

Object res1 = call(c1, "Hello");

Object res2 = call(f2, "Hello", 1)

如何实现这种方法?参数的可能功能类型的集合lambda不受限制。


慕容708150
浏览 153回答 3
3回答

catspeake

“ Lambda表达式”不是值的类型(例如“ object”或“ int”)。这是一种表达值的方式,例如字符串文字。在Java中,您不能编写“采用字符串文字的方法”,而只能编写采用字符串的方法。您无法判断参数是否使用文字创建。与lambda完全相同-您无法编写“采用lambda”或将lambda视为某种特殊情况的方法。一旦使用lambda创建接口的实例,它的lambda特定的属性就消失了,至少从Java语义的角度来看。简而言之,您要实现的目标并不是合理地使用lambdas-您将需要反思或重新考虑您的体系结构。-编辑:有两点需要澄清内部类完全相同-当您引用实现SomeInterface的对象时,无法知道它是通过内部类还是顶级类实现的。没有“内部类值类型”。请注意,lambda可用于构造任何接口的值-您可以使用任意数量的方法创建一个接口,然后将其扩展为另一个接口,除了一个方法外,所有方法均采用默认实现,然后使用a定义最后一个lambda。(再次编辑,感谢Sarel Foyerlicht指出了一个错误)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java