Die Besetzung ist nicht sicher, weil, obwohl U
Foo<String>
erstreckt, ist es nicht (notwendigerweise) der Fall ist, dass Bar<U>
Bar<Foo<String>>
erstreckt. Tatsächlich wird sich Bar<U>
nur Bar<Foo<String>>
erstrecken, wenn sie das gleiche sind, d. H. Wenn U
Foo<String>
ist.
Intuitiv kann es scheinen, dass (zum Beispiel) List<String>
ein Untertyp von List<Object>
sein sollte, aber das ist nicht, wie Generika funktionieren. List<String>
ist ein Untertyp von List<? extends Object>
, aber es ist nicht ein Untertyp von List<Object>
. (Es kann mehr Sinn machen, ein Beispiel wie Comparable<T>
zu berücksichtigen: Comparable<String>
bedeutet „verglichen werden können, um jede String
, während Comparable<Object>
bedeutet‚verglichen werden können, um jede Object
‘Es sollte klar sein, dass Comparable<String>
kein Subtyp von Comparable<Object>
sein sollte..)
[& hellip;] die Besetzung werfen wird nicht [& hellip;] und damit die Besetzung in der Tat sicher ist
ich glaube, du Missverständnis die Art der Warnung?.Eclipse warnt dich, dass dieser Cast nicht werfen wird, auch wenn es, und das ist eigentlich warum ist es nicht sicher ist. Zum Beispiel ist dieser Code:
final Object o = Integer.valueOf(7);
final String s = (String) o;
ist absolut sicher, weil die Besetzung eine Ausnahme werfen wird. Aber dieser Code:
final List<?> wildcardList = new ArrayList<Integer>(Integer.valueOf(7));
final List<String> stringList = (List<String>) wildcardList;
ist unsicher, weil die Laufzeit keine Möglichkeit zur Überprüfung der Besetzung hat (aufgrund der Löschung), so dass es nicht eine Ausnahme auslösen, auch wenn es falsch ist: stringList
ist jetzt ein List<String>
, dessen erstes Element vom Typ Integer
ist. (Was passiert, ist, irgendwann später, können Sie eine spontane ClassCastException
bekommen, wenn Sie versuchen, etwas mit diesem Element zu tun.)
Ausgezeichnete Antwort. Vielen Dank! –
@DongieAgnir Sie sind wahrscheinlich in Ordnung mit 'List> 'und' public boolean addBar (Balken erweitert Foo >) ' –
irreputable