Ich kämpfte darum, einen richtigen Titel für diese Frage zu finden, weil das Phänomen, das ich beobachtete, sehr seltsam ist. Daher überspringe ich es, mein Problem wörtlich zu erklären und zeige stattdessen (hoffentlich) selbst beschreibenden Code. Betrachten Sie die folgende parametrisierte Klasse:Warum verliert der Eclipse-Compiler den festen Typparameter?
public class GenericOptional<T> {
public GenericOptional(T someValue) {}
public T getValue() { return null; }
public Optional<String> getOptionalString() { return Optional.empty(); }
}
Was Ich mag zu betonen ist, dass der Rückgabetyp Optional<String>
des Verfahrens getOptionalString()
nicht davon abhängt, den Typ-ParameterT
.
haben nun einen Blick auf die folgenden Code, der innerhalb Eclipse-Luna 4.4.2 mit 8u45 Java kompiliert wird:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional go = (GenericOptional) obj;
Optional os = go.getOptionalString();
}
Die lokale Variable os
hat den Typ Optional
ohne Typ- ParameterString
! Der Eclipse Compiler hat die Information über den festen Typ-Parameter verloren. Weiß jemand warum?
Betrachten Sie nun ein zweites Codebeispiel:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional<?> go = (GenericOptional) obj;
Optional<String> os = go.getOptionalString();
}
die lokale Variable go
als GenericOptional<?>
den Rückgabetyp der Methode getOptionalString()
jetzt Optional<String>
Durch die Deklaration ist wie erwartet.
Kann jemand dieses Verhalten erklären?
Vielen Dank für die Antwort. Kocko gab die gleiche Antwort und ich weiß nicht, wie ich Ihnen die richtige/beste Zustimmung geben soll. Aufgrund der Tatsache, dass Sie die Frage zuerst beantwortet haben, obwohl Sie keinen Beispielcode zur Unterstützung Ihrer Erklärung angegeben haben, werde ich Ihnen die "hilfreichste" Genehmigung geben. Wenn Sie denken, dass Kockos Antwort für Leute, die wissen wollen, wie es funktioniert, von größerem Wert ist, lassen Sie mich Nein und ich werde die "äußerst hilfreiche" Zustimmung an Kocko weiterleiten. – Harmlezz