栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java是否允许将功能接口用作方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java是否允许将功能接口用作方法?

你的主张

之前,您的建议已在lambda-dev邮件列表中进行了讨论:

http://mail.openjdk.java.net/pipermail/lambda-dev/2012-February/004518.html

它之所以被拒绝是因为解析器/编译器会出现与歧义有关的各种问题。或用Brian Goetz的话来说:

我认为,归根结底,这只是对功能接口而不是功能类型的承诺感到不舒服,并且试图退缩到一尘不染的中间立场。我不认为这提供了足够的吸引力。

如果您认为这样的“精打细算”功能仍会为Java语言增加价值,则可以在其中一个lambda邮件列表中再次尝试您的运气,也许使用引人注目的参数:-)

替代

这是可能的,但可能不如示例语法所建议的那样优雅。根据Brian Goetz的最新的lambda状态,将在各章中提到方法参考

8方法参考

[…]

9种方法参考

[…]实际上有三种不同的方法引用,每种语法的语法略有不同:

  • 静态方法
  • 特定对象的实例方法
  • 特定类型的任意对象的实例方法

因此,实际上,您的示例必须按照以下方式改写:

interface Func { void execute(int i); }void call(Block<Integer> block){    block.run(1); //instead of f.execute(1);}

现在,您可以传递对该execute方法的引用:

// Disclaimer: I didn't check this against a JDK8 compiler...Func f = (i) -> { ; }; // Empty sample implementationcall(f::execute)

换句话说,“功能”样式将在调用方法的声明站点而不是使用站点上实现。但是,与Javascript一样,使用站点不必知道中具体方法的名称

Func
。它只能接受
Blockfor
方法返回
void
Callablefor
方法返回值。

注意,在JDK的Mercurial存储库中,情况已经发生了变化。

run()
正如lambda状态中所提到的,您将再也找不到。其他有趣的类型可以在java.util.functions包中找到:

http://hg.openjdk.java.net/lambda/lambda/jdk/file/tip/src/share/classes/java/util/function



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/497235.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号