2010-05-20 8 views

Antwort

6

Bei der Zuweisung zu einer Variablen (Set<T>) mit einem nicht-Wildcard-generischen Typ T Das Objekt, das zugewiesen werden soll, muss genau T als generischer Typ haben (einschließlich aller generischen Typparameter T, Platzhalter und Nicht-Platzhalter). In Ihrem Fall T ist Cage<Lion>, die nicht den gleichen Typ wie Cage<? extends Animal> ist.

Was Sie tun können, weil Cage<Lion>-Cage<? extends Animal> zuordenbar ist, ist die Wildcard-Typ:

Set<? extends Cage<? extends Animal>> a = new Set<Cage<Lion>>(); 
+0

+1 für die tatsächliche Lösung. –

+0

Danke für mich, das war der fehlende Teil. –

6

Das ist falsch, denn wenn es erlaubt würde, dann würde dies legal sein:

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); 
cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal> 

Cage<Tiger> im Rahmen der Erklärung ist, aber nicht die Definition, so würde dies zum Absturz bringen.

+0

Wie kann Java entscheiden, ob Kontra/Kovarianz oder nicht anwenden? – Simon

+0

Mein Verständnis Java behandelt Generics als invariant (aber, seltsamerweise, behandelt Arrays als Kovarianten und Typprüfungen zur Laufzeit), sondern durch Schreiben von Methoden mit geeigneten Platzhalterparametern (extends oder super) und ein bisschen Casting und Unterdrückung von ungeprüften Conversions kann den Eindruck vermitteln, was in Ihrem Fall angemessen ist. – pdbartlett

2

Sie benötigen:

Set<? extends List<? extends Number>> cc = new HashSet<ArrayList<Integer>>(); 

zu erklären, warum ... Ich denke, zurück bis zu einer einfacheren Version Ihres Beispiel:

Number a = new Integer(1); // OK 
Set<Number> b = new HashSet<Integer>(); // not OK 

dies nicht funktioniert, weil es erlauben würde,