While manipulating Java 8 streams I've encountered an error where the compiler seems to 'forget' the type my generic parameters.
The following snippet creates a stream of class names and attempts to map the stream to a stream of 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)
;
}
When I uncomment the filter to remove the null entries from the stream I get a compile error
Type mismatch: cannot convert from Class<capture#15-of ? extends CharSequence> to Class<Object>
Can someone please explain to me why adding the filter causes this error?
PS: The code here is somewhat arbitrary and it's easy enough to make the error go away: Assign the mapped stream to a temporary variable before applying the filter. What I'm interested in is why the above code snippet generates a compile time error.
Edit: As @Holger pointed out the this question is not an exact duplicate of Java 8 Streams: why does Collectors.toMap behave differently for generics with wildcards? because the problematic snippet there currently compiles without issues while the snippet here does not.