为了账号安全,请及时绑定邮箱和手机立即绑定

如何调用未知类型的lambda

如何调用未知类型的lambda

慕容708150 2021-05-07 19:39:42
考虑我们有一组变量,这些变量包含对方法的引用: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-您将需要反思或重新考虑您的体系结构。

-编辑:有两点需要澄清

  1. 内部类完全相同-当您引用实现SomeInterface的对象时,无法知道它是通过内部类还是顶级类实现的。没有“内部类值类型”。

  2. 请注意,lambda可用于构造任何接口的值-您可以使用任意数量的方法创建一个接口,然后将其扩展为另一个接口,除了一个方法外,所有方法均采用默认实现,然后使用a定义最后一个lambda。

(再次编辑,感谢Sarel Foyerlicht指出了一个错误)


查看完整回答
反对 回复 2021-05-19
  • 3 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信