Ich habe vor kurzem begonnen, meine Java-Projekte mit Eclipse nullability Annotationen zu aktualisieren. Ich habe ein JavaFX-Basisprojekt mit einigen Übersetzungsklassen.Wo gehört der Typ Annotation in einen begrenzten Platzhalter?
Jetzt in meinem LocalizedList initialisiere ich es mit einem Element in der Dokumentstruktur und es rekursiv fügt alle seine Unterelemente hinzu.
@NonNullByDefault
private void locChildren(Styleable c) {
String localizable = getKey(c);
if(localizable != null) {
backingMap.put(c, localizable);
setText(c, localizable);
}
if(c instanceof MenuBar) {
MenuBar mb = (MenuBar)c;
initLoc(mb.getMenus());
} // else if ...
}
@NonNullByDefault
public void initLoc(List<? extends Styleable> s) {
for(Styleable c : s) {
locChildren(c);
}
}
Nun, wenn ich es mit nur bekomme ich Nachricht
die schrecklich lange Warnung dieses linksNull type safety (type annotations): The expression of type 'ObservableList<Menu>' needs unchecked conversion to conform to '@NonNull List<? extends @NonNull Styleable>', corresponding supertype is 'List<Menu>'
Dieser weil MenuBar#getMenus() ist nicht mit NULL-Zulässigkeit Anmerkungen kommentiert, und zu erwarten.
Nach dem Anwenden der Annullierung @Nullable auf die Liste selbst wurde das Problem nicht gelöst. Also habe ich @Nullable zum Platzhalter hinzugefügt. Hier bin ich auf etwas Verwirrendes gestoßen.
@NonNullByDefault
public void initLoc1(@Nullable List<@Nullable ? extends Styleable> s) {
for(Styleable c : s) {
locChildren(c);
}
}
@NonNullByDefault
public void initLoc2(@Nullable List<@Nullable ? extends @Nullable Styleable> s) {
for(Styleable c : s) {
locChildren(c);
}
}
@NonNullByDefault
public void initLoc3(@Nullable List<? extends @Nullable Styleable> s) {
for(Styleable c : s) {
locChildren(c);
}
}
Jede dieser drei Deklarationen ist gültig und kompiliert, aber nur die letzte macht die Warnmeldung verschwinden.
Ich hätte die erste als gültig zu erwarten, da sie den „Typ“ tatsächlich annotiert, das sich in dem Verfahren verwendet wird, und bin vollständig von dem zweiten Beispiel verwirrt.
Was genau ist der semantische Unterschied zwischen diesen drei Deklarationen, und warum funktionieren drei, während zwei und eins nicht?
Ich bin ein wenig überrascht, dass der Compiler Typ Anmerkungen auf dem Platzhalter überhaupt akzeptiert. Es ist kein Typ. Sind Sie sicher, dass die in den ersten beiden Fällen angezeigten Warnungen nicht mit * dem * in Zusammenhang stehen? Es ist nicht schwer, sich auf die Tatsache zu konzentrieren, dass Sie immer noch Warnungen erhalten und übersehen, dass es sich um verschiedene Warnungen handelt. –
@John Ich bin mir nicht sicher, ob ich Sie richtig verstanden habe, aber die drei Fehlermeldungen (keine Anmerkung, Platzhalter kommentiert, beide kommentiert) sind verschieden, aber nur dadurch, dass sie die Liste ändern <...>-Typ: 'List extends @NonNull Styleable> '(wie durch die' @ NonNullByDefault' Annotation), 'List <@Nullable? erweitert Styleable> 'und' List <@Nullable? extends @Nullable Styleable> '. Der Rest der Warnungen bleibt gleich. – Adowrath
@John Obwohl ich die Argumentation noch nicht gefunden habe, scheint es eine Ergänzung zu Java 8 JLS zu sein. Vergleichen Sie [JLS 8, 4.5.1] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.5.1) und [JLS 7, 4.5.1 ] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1) – Adowrath