2012-11-24 7 views
0

Pourquoi ne puis-je pas classcastexception? E signifie C dans l'exemple, n'est-ce pas? B n'est pas C, je pensais que ma distribution ne devait fonctionner que pour le compilateur. Où est mon erreur?Pourquoi je ne peux pas classcastexception?

public class A{ 
public static void main(String...s){ 
    Monitor<C> m = new Monitor<C>(); 
    C arg2 = new C(); 
    B d = m.f(arg2); 
    System.out.println(d); 
    } 
} 
class B extends A{} 
class C extends B{} 
class Monitor<E extends B>{ 
public E f(E E){ 
    return (E) new B();//Why this place didn't give me ClassCastException? 
} 
} 
+0

S'il vous plaît nettoyer votre code source, il semble horrible. Et s'il vous plaît essayez de clarifier la question, c'est assez difficile à comprendre. – Polygnome

+0

Pourquoi surveiller seul? pourquoi pas M – vels4j

Répondre

0

En raison de l'effacement de type que vous ne pouvez pas lancer à E, Ceci est dû à un effacement de type dans les génériques. Puisque vous avez le type générique <E extends B> la déclaration return (E) new B() est compilée en return (B) new B() donc vous n'avez pas ClassCastException.

+0

Pour implémenter des génériques, le compilateur Java applique l'effacement de type à: Remplace tous les paramètres de type dans les types génériques par leurs bornes ou Object si les paramètres de type sont non bornés. Le bytecode produit contient donc uniquement des classes, des interfaces et des méthodes ordinaires. Ma limite est (B), n'est-ce pas? Peut-être alors, je vais avoir (B) nouveau B? –

+0

@ user1849430 Oui. Tu as raison. – bellum

+0

Merci les gars, je l'ai vraiment compris) –

Questions connexes