考虑我们有一组变量,这些变量包含对方法的引用: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 nullObject res1 = call(c1, "Hello");Object res2 = call(f2, "Hello", 1)如何实现这种方法?参数的可能功能类型的集合lambda不受限制。
3 回答
catspeake
TA贡献1111条经验 获得超0个赞
“ Lambda表达式”不是值的类型(例如“ object”或“ int”)。这是一种表达值的方式,例如字符串文字。
在Java中,您不能编写“采用字符串文字的方法”,而只能编写采用字符串的方法。您无法判断参数是否使用文字创建。
与lambda完全相同-您无法编写“采用lambda”或将lambda视为某种特殊情况的方法。一旦使用lambda创建接口的实例,它的lambda特定的属性就消失了,至少从Java语义的角度来看。
简而言之,您要实现的目标并不是合理地使用lambdas-您将需要反思或重新考虑您的体系结构。
-编辑:有两点需要澄清
内部类完全相同-当您引用实现SomeInterface的对象时,无法知道它是通过内部类还是顶级类实现的。没有“内部类值类型”。
请注意,lambda可用于构造任何接口的值-您可以使用任意数量的方法创建一个接口,然后将其扩展为另一个接口,除了一个方法外,所有方法均采用默认实现,然后使用a定义最后一个lambda。
(再次编辑,感谢Sarel Foyerlicht指出了一个错误)
添加回答
举报
0/150
提交
取消