[英]Integer::toString in Optional.map
在Java中使用帶方法引用的map時,我遇到了以下問題:
public class Dummy {
public static void main(String[] args) {
IntegerHolder ih = new IntegerHolder();
Optional<IntegerHolder> iho = Optional.of(ih);
iho.map(IntegerHolder::getInteger).map(Objects::toString);
iho.map(IntegerHolder::getInteger).map((Integer ii) ->ii.toString());
iho.map(IntegerHolder::getInteger).map(Integer::toString);// this line will not compile. The error is "non-static method toString() cannot be referenced from a static context"
}
private static class IntegerHolder {
private Integer i;
Integer getInteger() {return i;}
}
}
在我看來,Integer :: toString與IntegerHolder :: getInteger相同。 兩者都是“引用特定類型的任意對象的實例方法”我不明白為什么一個工作,但另一個不工作。 你能否對這個問題有所了解? 非常感謝你。
錯誤是非常誤導的,例如在java-11中錯誤會更有意義:
對toString的引用是不明確的
Integer中的toString(int)方法和Integer匹配中的toString()方法)
如果您通過lambda表達式重寫此方法,您將看到兩個簽名都可能匹配:
iho.map(IntegerHolder::getInteger).map((Integer ii) -> Integer.toString(ii));
iho.map(IntegerHolder::getInteger).map((Integer ii) -> ii.toString());
這兩個都可以重寫為方法參考,但在這種情況下,調用哪種方法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.