2015-10-22 241 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);