Java: “? erweitert habe ich" kann nicht konvertiert werden "? erweitert ich"
Diesem code:
interface I {}
public class Test {
TableView<? extends I> table;
Test(ObservableList<? extends I> list) {
table = new TableView<>();
table.setItems(list);
}
}
...produziert diese Meldung:
error: method setItems in class TableView<S> cannot be applied to given types;
table.setItems(list);
required: ObservableList<CAP#1>
found: ObservableList<CAP#2>
reason: argument mismatch; ObservableList<CAP#2> cannot be converted to ObservableList<CAP#1>
where S is a type-variable:
S extends Object declared in class TableView
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends I from capture of ? extends I
CAP#2 extends I from capture of ? extends I
Wie kann es einen "type mismatch" zwischen zwei identischen Typen? Was bin ich?
- Ich hatte gestern einige Früchte. also
? extends Fruit
Heute hatte ich etwas Obst.? extends Fruit
. Kann jemand davon ausgehen, dass die Informationen, die ich hatte die gleiche Art von Obst an beiden Tagen? Nein.some fruit #1
vielleicht nichtsome fruit #2
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Java Generics
?
Platzhalter können nicht identisch sein, weil es sich um unbekannte Typen. Eine unbekannte Art kann nicht gleich einer anderen unbekannten Typ.Wenn Sie möchten, dass die Typen übereinstimmen, dann müssen Sie einen generischen Typ-parameter, auf die
Test
Klasse, und beziehen es in Ihre Klasse."Da wir nicht wissen, was die element Typ c steht, können wir Sie auf Objekte hinzufügen, um es. Die add () - Methode hat Argumente vom Typ E, Typ des Elements der collection. Wenn der eigentliche parameter vom Typ ist ?, es steht für einige unbekannte geben. Alle parameter, die wir übergeben, um hinzuzufügen, wäre ein Untertyp von diesem unbekannten Typ. Da wir nicht wissen, welche Art das ist, wir nicht passieren können, alles in. Die einzige Ausnahme ist null, was ist ein Mitglied von jedem Typ.
Auf der anderen Seite, da eine Liste, wir können aufrufen von get() und nutzen Sie das Ergebnis. Der Ergebnis-Typ ist ein unbekannter Typ, aber wir wissen immer, dass es ein Objekt ist. Es ist daher sicher weisen Sie das Ergebnis der get() auf eine variable des Typs Objekt oder übergeben Sie es als parameter, wo der Typ Object erwartet." (http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html)
Nicht verwenden "? erweitert habe ich" in Ihrer Deklaration von Variablen. Es fügt keinen semantischen Wert und ist die Quelle des Problems. Sie sehen, der compiler weigert sich anzunehmen, dass die '?' in einer Erklärung ist identisch mit dem '?' in einem anderen. Dies ist natürlich, da gibt es keine Garantie, dass Sie sind. Ich würde verzichten auf die '?' insgesamt: