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.
Was ist der Fehler? – Sean
woher kommt lowlyEmployee? ¿ – Tom
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