2010-11-07 25 views
1

Je suis en train de transférer un projet C# en Java. J'ai un morceau de code qui ressemble à ceci:Est-il possible de taper cast dans une classe abstraite parent?

public abstract class A 
{ 
    public abstract void foo() throws Exception; 
    public abstract void bar(); 
} 

Et puis, d'ailleurs ...

public class FirstOuterClass { 
    public class FirstInnerClass extends A { 
        // defines foo() and bar() 
    } 
} 

De plus ailleurs ...

public class SecondOuterClass {  
    public class SecondInnerClass extends A { 
        // defines foo() and bar() 
    } 
} 

Et enfin, même PLUS ailleurs ...

HashMap<Type, A> handlers = new HashMap<Type, A>(); 
     for (Entry e : HashMapOfStringToEntry.getTypes()) 
     {  
      if(e.Handler != null) { 
       handlers.put(e.Type, (A) e.Handler); 
      } 
     } 

e.Handler peut être e Ither un type de FirstInnerClass ou SecondInnerClass. Il est cette conversation e.Handler (A) qui provoque l'erreur suivante:

java.lang.ClassCastException: java.lang.Class 

J'ai vérifié avec le débogage sortie qui e.Handler est en effet un type de classe de FirstOuterClass $ FirstInnerClass. Donc, soit il existe des différences dans la coulée entre C# & Java (possible) ou je ne fournis pas la bonne syntaxe quelque part (aussi possible).

(Je suis désolé de ne pas coller tout le code, comme pour les HashMaps.) Je ne veux pas embrouiller le vrai problème, mais c'est un mappage entre une clé String et quelques classes abstract A.)

+0

Cela semble bien, mais pourquoi le type statique d'e.Handler n'est pas A donc vous évitez la distribution, et obtenez le problème à sa source? –

+0

Pouvez-vous fournir plus de données sur HashMapOfStringToEntry? votre boucle foreach est confuse. La carte renvoie l'entrée et vous utilisez autre chose. Il semble que cela renvoie une implémentation locale d'Entrée qui peut aider ici. – Bivas

Répondre

3

Si l'un de vos classes internes ne parvenait pas à jeter à A, votre exception ressemblerait à ceci:

java.lang.ClassCastException: FirstOuterClass$FirstInnerClass cannot be cast to A

, vous obtenir ce lieu:

java.lang.ClassCastException: java.lang.Class

Vous interrompez "ne peut pas être moulé à A" à la fin de cela? Quoi qu'il en soit, il semble que e.Handler est de type java.lang.Class. Comme dans FirstOuterClass$FirstInnerClass lui-même plutôt que d'une seule instance de celui-ci.

+0

Vous avez raison, mais je ne sais pas pourquoi. Si je fais une instanceof vérifier sur e.Handler, je l'ai mis à java.lang.Class - il ne s'identifie pas comme une sous-classe ... – GJTorikian

+0

En fait, je pense que je l'ai eu, et c'est comme tu l'as dit. Je n'ai pas d'instanciation de l'objet; Je ne fais que passer e.Handler.class, en effet. Existe-t-il un moyen de comparer l'héritage de classe pour les objets non instanciés? – GJTorikian

+0

Compris. J'ai eu besoin de mes classes pour implémenter java.lang.reflect.Type et instancier les classes comme des objets correctement. Désolé pour les 3 commentaires, je n'arrive pas à éditer le mien. Marquage comme réponse. JE VOUS REMERCIE! – GJTorikian

0

À partir du message d'exception, il apparaît que vous essayez de diffuser une instance de Class, pas une instance de la classe qu'il représente.