Durante la manipolazione di stream Java 8 ho riscontrato un errore in cui il compilatore sembra "dimentica" il tipo i miei parametri generici.Java Stream Generics Tipo non corrispondente
Il seguente frammento di codice crea un flusso di nomi di classi e tenta di associare il flusso a un flusso di 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)
;
}
Quando ho rimuovere il commento il filtro per rimuovere le voci nulli dal flusso ottengo un errore di compilazione
Tipo non corrispondente: non può convertire da Class < cattura # 15-di? estende CharSequence > alla Classe <oggetto>
Qualcuno può spiegare a me perché aggiungendo il filtro fa sì che questo errore?
PS: Il codice qui è alquanto arbitrario ed è abbastanza semplice per far sparire l'errore: Assegnare il flusso mappato a una variabile temporanea prima di applicare il filtro. Quello che mi interessa è perché lo snippet di codice sopra lo genera un errore di compilazione.
Modifica: come sottolineato da @Holger, questa domanda non è un duplicato esatto di Java 8 Streams: why does Collectors.toMap behave differently for generics with wildcards? perché lo snippet problematico al momento viene compilato senza problemi mentre lo snippet qui non lo è.
Huh. All'inizio pensavo che fosse dovuto a [metodo di concatenazione] (http://stackoverflow.com/q/24794924/1743880) ma non ne sono sicuro. 'asSubclass' restituisce veramente una' Classe estende CharSequence> '. Non si compila anche con 'javac', almeno 1.8.0_74. – Tunaki
Posso farlo compilare con la chiamata a 'filter' con un argomento di tipo esplicito a' map': '.> map ('. Oppure posso farlo compilare con' return CharSequence.class' invece di 'return null' dopo il blocco' catch'. Sembra un problema con l'inferenza di tipo –
rgettman
Non è un problema con javac 1.8.0_31. – saka1029