Integer::toString 在 Optional.map

Integer::toString in Optional.map

在 Java 中使用带有方法引用的映射时,我遇到了以下问题:

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 相同。两者都是 "Reference to an Instance Method of an Arbitrary Object of a Particular Type" 我不明白为什么一个有效,但另一个无效。 你能解释一下这个问题吗?非常感谢。

该错误非常具有误导性,例如在 java-11 中错误会更有意义:

reference to toString is ambiguous

both method toString(int) in Integer and method toString() in Integer match)

如果您通过 lambda 表达式重写此方法,您将看到两个签名可能匹配:

iho.map(IntegerHolder::getInteger).map((Integer ii) -> Integer.toString(ii));
iho.map(IntegerHolder::getInteger).map((Integer ii) -> ii.toString());

这两个都可以重写为方法引用,但是这样的话,调用哪个方法呢?