gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:05:57 26 4
gpt4 key购买 nike

我想知道如何区分同名的静态和非静态方法引用。在我的示例中,我有一个名为 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 的未绑定(bind)引用与对静态方法 append 的引用具有相同的元数、参数类型甚至返回值,所以不,您无法解决方法引用的消歧问题。如果您不想重命名其中一种方法,则应改用 lambda:

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

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

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

关于java - 方法引用静态与非静态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33284269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com