Путаница с выводом типа Java - PullRequest
0 голосов
/ 11 октября 2018

Может кто-нибудь объяснить мне, почему этот тип выражения автоматически не выводится компилятором?

Stream.empty().collect(Collectors.summingInt(CharSequence::length))

Мы знаем, что CharSequence::length в этом контексте является ToIntFunction<CharSequence>, поэтому тип, используемый из элементов потока, равен CharSequence, поэтому собираемый поток имеет тип Stream<CharSequence>.

В моей среде IDE появляется следующая ошибка:

Метод сбора (Коллектор) в типе Stream не применим для аргументов (Collector)

Как видно из сообщения об ошибке, Stream.empty() автоматически выводится на Stream<Object>, что определенно не то, что я хочу!

1 Ответ

0 голосов
/ 11 октября 2018

Java Stream.empty() - это обобщенный метод со следующим объявлением.

public static<T> Stream<T> empty() {
   // Remainder omitted.
}

Таким образом, вы должны явно передать параметры типа.В противном случае он создаст Stream типа java.lang.Object.Поэтому измените объявление так, чтобы избавиться от ошибки.

Stream.<CharSequence>empty().collect(Collectors.summingInt(CharSequence::length));

Java не будет выводить тип на основе типов данных, используемых в последующих операциях в вашем конвейере обработки stream.Алгоритм разрешения типов не такой умный, как вы думаете.Однако он будет выводить, если вы передадите значения фабричному методу.Для примера это будет работать.

Stream.of("ab", "abc").collect(Collectors.summingInt(CharSequence::length));
...