Integer :: toString в Optional.map - PullRequest
       13

Integer :: toString в Optional.map

0 голосов
/ 23 января 2019

При использовании 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. Оба являются «ссылкой на метод экземпляра произвольного объекта определенного типа» Я не понимаю, почему один работает, а другой нет. Не могли бы вы пролить свет на этот вопрос? Большое спасибо.

1 Ответ

0 голосов
/ 23 января 2019

Ошибка очень вводит в заблуждение, например, в java-11 ошибка будет иметь гораздо больший смысл:

ссылка на toString неоднозначна

оба метода toString (int) в Integer и метод toString () в Integer match)

Если переписать этот метод с помощью лямбда-выражения, вы увидите, что обе сигнатуры могут потенциально совпадать:

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

оба они могут быть переписаны в качестве ссылки на метод, но в таком случае какой метод вызывать?

...