Merkwürdiger Generics Fehler - Was will mir der Compiler sagen?

Hallo zusammen,

vielleicht werdet ihr aus dem Fehler schlau, ich werde es nicht

Beispiel

import javafx.scene.control.TableView;

    private TableView<? extends Object> tv;
    
    public void set( ObservableList<? extends Object> data ) {
        tv.setItems( data );
    }

einfach an irgendeine Stelle kopieren.

Weil deine Liste damit read-only ist. Bin mir gerade selber nicht sicher, wie der Mechanismus dahinter ist, aber mit <? super Object> sollte es funktionieren (laut Pecs: Producer extends, Consumer super).

Siehe hier: https://stackoverflow.com/a/2602788 (da findet sich dann vllt auch noch eine genauere Erklärung).

Gleicher Fehler.

Der einzige Workaround den ich gefunden habe, ist ein Generic „T“ mit „extends Object“ in der Klasse einmalig zu definieren.

public class Table<T extends Object> {
    private TableView<T> tv;
    
    public void set( ObservableList<T> data ) {
        tv.setItems( data );
    }
}

So funktioniert das wunderbar :sweat_smile:

Aber warum?

Dein T ist ein unbekannter, aber fester Typ. Ein ? kann dagegen alles mögliche sein, das heißt dass in deinem Eingangsbeispiel tv eine TableView<String> sein kann, an der du dann z.B. eine ObservableList<Date> zu setzen versuchst. Du kannst mit ? also nicht garantieren, dass die zur Laufzeit übergebenen Typen “zusammenpassen”, während das in deinem zweiten Beispiel immer sichergestellt ist (weil schon der Compiler rummeckern würde, wenn du T mit verschiedenen Typen belegen würdest).

? extends Object ist das gleiche wie ? (alles extended Object, automatisch).

Und… wenn dort sowieso keine spezifischen Typinformationen benötigt werden, könnte man vielleicht auch einfach TableView<Object> verwenden (je nachdem, wie und wo das genau verwendet werden soll)