方法参考静态与非静态
Method reference static vs non static
我想知道如何区分同名的静态和非静态方法引用。在我的示例中,我有一个名为 StringCollector
的 class,它具有以下三种方法:
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
的未绑定引用与对静态方法 append
的引用具有相同的元数、参数类型甚至 return 值,所以不,您无法解决方法引用的消歧问题。如果您不想重命名其中一种方法,则应改用 lambda:
collect(StringCollector::new, (sb, s) -> sb.append(s), StringCollector::concat);
或者如果你真的想使用静态方法:
collect(StringCollector::new, (sb, s) -> StringCollector.append(sb, s),
StringCollector::concat);
我想知道如何区分同名的静态和非静态方法引用。在我的示例中,我有一个名为 StringCollector
的 class,它具有以下三种方法:
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
的未绑定引用与对静态方法 append
的引用具有相同的元数、参数类型甚至 return 值,所以不,您无法解决方法引用的消歧问题。如果您不想重命名其中一种方法,则应改用 lambda:
collect(StringCollector::new, (sb, s) -> sb.append(s), StringCollector::concat);
或者如果你真的想使用静态方法:
collect(StringCollector::new, (sb, s) -> StringCollector.append(sb, s),
StringCollector::concat);