2009-07-12 10 views
0

der Code:? (Die Linie, die die Kompilierung Fehler zeigen wird, ist 3)Warum zeigt compile_error?

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo); 
Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK 
wildcardBuddies.setFirst(lowlyEmployee); // compile-time error 

der Fehler über „Keine Korruption ist möglich“

und was ist die Art von wildcardBuddies (Pair<? extends Employee> or Pair<Manager>)

+2

Was ist der Fehler? – Sean

+0

woher kommt lowlyEmployee? ¿ – Tom

+0

Ich denke nicht, dass "keine Korruption möglich ist" ist der Fehler. Haben Sie versucht, das Beispiel zu kompilieren, das Sie verwenden möchten? – akf

Antwort

1

fand ich dies: http://userpages.umbc.edu/~edelman/341/Generics.pdf

Es beschreibt das genaue Problem.

+0

Diese Frage ist direkt aus diesem Dokument. Das JDK gibt nicht einmal den beschriebenen Fehler "Keine Beschädigung ist möglich" (das ist im Dokument), es gibt "Die Methode setFirst (Capture # 1-of? Extends Employee) im Typ Pair gilt nicht für die Argumente (Mitarbeiter) " – stevedbrown

+0

Ja, die Frage ist direkt aus dem Dokument, aber darunter ist die Antwort. Es sei denn, der Fragesteller ist verwirrt über die Antwort in dem Dokument? –

3

Der Grund, dass Code zu einem Fehler führt, ist, weil es keine Möglichkeit gibt, zu wissen, welche bestimmte Unterklasse von Employee WildcardBuddies akzeptieren wird. Warum ist der Compiler unsicher? Um zu sehen, dass, schauen wir genauer auf dem Code:

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo); 

Hier haben wir ein Paar-Manager erstellen, die eine Unterklasse von Mitarbeitern ist.

Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK 

Hier weisen wir das gerade erstellte Paar einem Objektpaar zu, das Employee oder eine Unterklasse davon sein muss. Beachten Sie, dass wir kein ein neues Objekt hier erstellen, nur einen zweiten Verweis auf das erste Paar machen.

wildcardBuddies.setFirst(lowlyEmployee); // compile-time error 

Jetzt versuchen wir, etwas zu tun, die nicht aus dem einfachen Grunde erlaubt sein soll, die lowlyEmployee ist kein Manager. Denken Sie daran, dass obwohl "wildcardBuddies" eine Referenz auf ein Paar von Employee-Subtypen ist, das Objekt, auf das es verweist, ganz spezifisch ein Paar von Managern ist und die Konvertierung von einer Oberklasse (Employee) in eine Unterklasse (Manager) nicht erlaubt ist. Da der Compiler nicht nach allen möglichen Szenarien suchen kann, in denen das Aufrufen von setFirst() für das tatsächliche zugrunde liegende Objekt mit den angegebenen Argumenten zulässig wäre, verfügt es über eine Regel, die sowohl jegliches illegales Verhalten als auch rechtliches Verhalten verbietet.

Hoffe dies hilft, die Antwort in der PDF besser zu erklären. Bitte korrigieren Sie mich, wenn ich irgendetwas falsch mache.