2015-10-22 192 views
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);
正如我们所看到的代码不能编译。我认为这是因为编译器无法设定,使用哪种方法,因为它们中的每一个都会匹配功能。现在的问题是:是否有任何可能的方法来从实例方法引用区分静态方法引用?

方法参考静态与非静态

+1

我真的不推荐的命名方法与你的班级一样... –

+1

另外,这里是一个C#答案,但它也非常适用于Java:http://stackoverflow.com/questions/160118/static-and-instance-methods-with-the-同名 –

+1

http://stackoverflow.com/q/21873829/2711488 – Holger

回答

6

在这种情况下未结合的参考append具有相同的元数,参数类型,甚至返回值的实例方法(PS是代码,如果我重命名两种方法之一编译对于每个模件。)作为对静态方法append的引用,所以不能,您无法解析方法引用的消歧。如果你不希望重命名的方法之一,你应该使用拉姆达代替:

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

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

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