Когда работают ссылки на методы?

Ссылки на методы не работают с нестатическими методами AFAIK. Я пытался использовать их следующим образом

Arrays.stream(new Integer[] {12,321,312}).map(Integer::toString).forEach(System.out::println);

Что привело к ошибке компиляции, как видно из ссылки.

Изображение ошибки

Проблема
При использовании библиотеки AssertJ я использовал что-то вроде этого,

AbstractObjectAssert<?, Feed> abstractObjectAssertFeed2 = assertThat(feedList.get(2));
abstractObjectAssertFeed2.extracting(Feed::getText).isEqualTo(new Object[] {Constants.WISH+" HappyLife"});

где Feed — существительное, а getText — метод получения и не статический, но он работал нормально без ошибок компиляции или каких-либо ошибок, которые меня озадачили.

Доказательство не является статическим методом.

Я что-то упустил в том, как работают ссылки на методы?


person Tarun Maganti    schedule 11.04.2017    source источник
comment
Вам действительно не нужно сопоставлять Integer с String, если вы хотите распечатать содержимое потока. Arrays.stream(new Integer[] {12,321,312}).forEach(System.out::println); работает нормально.   -  person Anton Balaniuc    schedule 11.04.2017
comment
и вы можете просто использовать .map(Object::toString) вместо .map(Integer::toString)   -  person Anton Balaniuc    schedule 11.04.2017
comment
@AntonBalaniuc Это был тест. Я создавал прототип, чтобы подтвердить, как работают ссылки на методы, и, к сожалению (или это действительно так), столкнулся с этой проблемой (которую я считал реальной) с ожидаемым сообщением об ошибке. Каковы шансы!   -  person Tarun Maganti    schedule 11.04.2017
comment
@AntonBalaniuc, должен ли я по-прежнему говорить, что вопрос, который вы отметили, решил мою проблему, когда я не сталкивался с той же проблемой, и она оказалась такой же?   -  person Tarun Maganti    schedule 11.04.2017
comment
Вы не должны игнорировать строку нижнего колонтитула «2 ошибки», которая указывает на то, что вы заранее проигнорировали другую ошибку. Как правило, с текущим компилятором, если вы видите два сообщения об ошибке: «нестатический метод… нельзя ссылаться из статического контекста» и еще одну ошибку, сначала сосредоточьтесь на «другой ошибке». Это сэкономит вам много времени.   -  person Holger    schedule 13.04.2017


Ответы (1)


Это недействительно по другой причине.

В основном есть две реализации toString в Integer.

static toString(int)

а также

/*non- static*/ toString()

Это означает, что вы можете написать свой поток следующим образом:

 Arrays.stream(new Integer[] { 12, 321, 312 })
       .map(i -> i.toString(i))
       .forEach(System.out::println);

Arrays.stream(new Integer[] { 12, 321, 312 })
       .map(i -> i.toString())
       .forEach(System.out::println);

Оба они квалифицируются как ссылка на метод через Integer::toString. Первый — это ссылка на метод static method. А второй Reference to an instance method of an arbitrary object of a particular type.

Поскольку они оба подходят, компилятор не знает, что выбрать.

person Eugene    schedule 11.04.2017
comment
Разве первый не Integer.toString(i)? - person Tarun Maganti; 11.04.2017
comment
@TarunMaganti да, я тоже мог бы написать это так (не получив предупреждения), но я подумал, что вам будет проще понять суть здесь ... - person Eugene; 11.04.2017
comment
Значит, это из-за двусмысленности. Если бы вы могли добавить изображение таблицы, было бы намного полезнее - docs .oracle.com/javase/tutorial/java/javaOO/ - person Tarun Maganti; 11.04.2017
comment
Ok. Понятно. Я забыл, что объекты могут использоваться для доступа к статическим методам. - person Tarun Maganti; 11.04.2017