Как исправить двусмысленный тип на ссылке метода (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);