Как исправить двусмысленный тип на ссылке метода (toString целого)?

При этом

Stream.of(1, 32, 12, 15, 23).map(Integer::toString);

Я получаю ошибку неоднозначного типа. Понятно, что компилятор не может сказать, имею ли я toString(int) или toString() из Integer.

Если вы не используете ссылку на метод, я мог бы выйти из этого с явным приложением или выписать длинную руку generics, , но как я могу сообщить компилятору, что я имею в виду здесь? Какой синтаксис (если таковой имеется) можно использовать для однозначного?

Ответы

Ответ 1

Невозможно сделать однозначные ссылки на методы; просто сказано, ссылки на методы - это функция, которая поддерживается только для однозначных ссылок на методы. Итак, у вас есть два решения:

  • используйте выражение лямбда:

    Stream.of(1, 32, 12, 15, 23).map(i->Integer.toString(i));
    
  • (желательно, по крайней мере, мной) Используйте поток примитивных значений int, когда источник состоит только из примитивных значений int:

    IntStream.of(1, 32, 12, 15, 23).mapToObj(Integer::toString);
    

    Это будет использовать статический метод Integer.toString(int) для использования значений int.

Ответ 2

Ваши основные параметры, используя ссылки на методы, следующие:

Stream.of(1, 32, 12, 15, 23).map(String::valueOf);
IntStream.of(1, 32, 12, 15, 23).mapToObj(Integer::toString);

Ваша текущая версия может означать i -> i.toString() или i -> Integer.toString(i).

Ответ 3

Так как Integer.toString() переопределяет Object.toString(), в этом конкретном случае вы можете исправить его следующим образом:

Stream.of(1, 32, 12, 15, 23).map(Object::toString);