ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 方法引用静态与非静态

2019-05-28 04:47:30  阅读:262  来源: 互联网

标签:java static java-8 method-reference


我想知道如何区分具有相同名称的静态和非静态方法引用.在我的例子中,我有一个名为StringCollector的类,它有以下三种方法:
StringCollector append(String string)
static StringCollector append(StringCollector stringCollector,String string)
StringCollector concat(StringCollector stringCollector)
现在,如果我想使用Stream< String>收集字符串列表我会写这样的东西:
Arrays.asList(“a”,“b”,“c”).stream()
.collect(StringCollector :: new,StringCollector :: append,StringCollector :: concat);
正如我们所看到的,代码无法编译.我认为这是因为编译器无法决定使用哪种方法,因为它们中的每一种都与功能相匹配.现在的问题是:是否有任何可能的方法来从实例方法引用中区分静态方法引用?
(PS:是的,如果我重命名两种方法中的一种,代码就会编译.对于每种方法.)

解决方法:

在这种情况下,对实例方法append的未绑定引用具有相同的arity,参数类型甚至返回值作为对静态方法append的引用,所以不,您无法解决方法引用的消歧.如果您不想重命名其中一个方法,则应该使用lambda:

collect(StringCollector::new, (sb, s) -> sb.append(s), StringCollector::concat);

或者,如果您确实想使用静态方法:

collect(StringCollector::new, (sb, s) -> StringCollector.append(sb, s),
        StringCollector::concat);

标签:java,static,java-8,method-reference
来源: https://codeday.me/bug/20190528/1168756.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有