При манипулировании потоками Java 8 я столкнулся с ошибкой, когда компилятор, похоже, "забыл" тип моих общих параметров.
Следующий фрагмент создает поток имен классов и пытается сопоставить поток с потоком Class<? extends CharSequence>
.
public static Stream<Class<? extends CharSequence>> getClasses() {
return Arrays.asList("java.lang.String", "java.lang.StringBuilder", "Kaboom!")
.stream()
.map(x -> {
try {
Class<?> result = Class.forName(x);
return result == null ? null : result.asSubclass(CharSequence.class);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
})
//.filter(x -> x != null)
;
}
Когда я раскомментирую фильтр для удаления нулевых записей из потока, я получаю ошибку компиляции
Несоответствие типов: невозможно преобразовать из класса < capture # 15-of? расширяет CharSequence > к классу <Object>
Может ли кто-нибудь объяснить мне почему добавление фильтра вызывает эту ошибку?
PS: Код здесь несколько произволен, и достаточно легко сделать ошибку: Присвойте отображаемый поток временной переменной перед применением фильтра. Меня интересует почему приведенный фрагмент кода генерирует ошибку времени компиляции.
Изменить: Поскольку @Holger указал, что этот вопрос не является точным дубликатом Java 8 Streams: почему Collectors.toMap ведет себя по-разному для дженериков с помощью подстановочных знаков?, потому что проблематичный фрагмент, который в настоящее время компилируется без проблем, в то время как фрагмент здесь отсутствует.