Ho faticato a trovare un titolo appropriato per questa domanda perché il fenomeno che ho osservato è molto strano. Quindi evito di spiegare il mio problema alla lettera e invece ti mostro un codice (che spero) auto-descrittivo. Si consideri il seguente classe parametrica:Perché Eclipse Compiler perde il parametro di tipo fisso?
public class GenericOptional<T> {
public GenericOptional(T someValue) {}
public T getValue() { return null; }
public Optional<String> getOptionalString() { return Optional.empty(); }
}
Quello che mi piace sottolineare è che il tipo di ritorno del metodo Optional<String>
getOptionalString()
non dipende dal tipo di parametroT
.
Ora uno sguardo al seguente codice, che viene compilato all'interno Eclipse Luna 4.4.2 utilizzando Java 8u45:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional go = (GenericOptional) obj;
Optional os = go.getOptionalString();
}
La variabile locale os
ha il tipo Optional
senza la tipo- parametroString
! Il compilatore Eclipse ha perso le informazioni sul parametro di tipo fisso. Qualcuno sa perché?
ora un'occhiata a un secondo esempio di codice:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional<?> go = (GenericOptional) obj;
Optional<String> os = go.getOptionalString();
}
dichiarando la variabile locale go
come GenericOptional<?>
il tipo di ritorno del metodo getOptionalString()
ora è Optional<String>
come previsto.
Qualcuno può spiegare questo comportamento?
Grazie per la risposta. Kocko ha dato la stessa risposta e non so come darti la corretta/migliore approvazione. Quindi, poiché hai risposto per primo alla domanda, anche se non hai fornito codice di esempio per supportare la tua spiegazione, ti darò l'approvazione "più utile". Se pensi che la risposta di Kocko sia più importante per le persone che vogliono sapere come funziona, lasciami fare e trasferirò l'approvazione "più utile" a Kocko. – Harmlezz