方法引用:静态 vs 非静态

4
我一直想知道如何区分同名的静态和非静态方法引用。在我的例子中,我有一个叫做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:如果我重命名其中一个方法,那么每个方法都可以编译。)

1
我真的不建议将方法命名为与您的类相同的名称... - Broots Waymb
1
此外,这里有一个C#的答案,但它也适用于Java:https://dev59.com/questions/GXVC5IYBdhLWcg3w21Mq - Broots Waymb
1
https://dev59.com/B2Eh5IYBdhLWcg3w7XLt - Holger
1个回答

6
在这种情况下,对实例方法append的未绑定引用与静态方法append的引用具有相同的arity、参数类型甚至返回值,因此无法解决方法引用的消歧。如果您不想重命名其中一个方法,应改用lambda表达式代替。
collect(StringCollector::new, (sb, s) -> sb.append(s), StringCollector::concat);

或者如果你真的想使用静态方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接