Ist es möglich, Guss zu einer übergeordneten abstrakten Klasse zu geben?
-
29-09-2019 - |
Frage
Ich bin im Begriff, einen C # -Projekt in Java portieren. Ich habe ein Stück Code bekam das wie folgt aussieht:
public abstract class A
{
public abstract void foo() throws Exception;
public abstract void bar();
}
Und dann an anderer Stelle ...
public class FirstOuterClass {
public class FirstInnerClass extends A {
// defines foo() and bar()
}
}
Weitere anderswo ...
public class SecondOuterClass {
public class SecondInnerClass extends A {
// defines foo() and bar()
}
}
Und schließlich sogar noch mehr an anderer Stelle ....
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 kann entweder eine Art von FirstInnerClass oder SecondInnerClass sein. Es ist das Gespräch e.Handler auf (A), das die folgenden Fehler verursacht:
java.lang.ClassCastException: java.lang.Class
Ich habe mit Debugging-Ausgabe bestätigt, dass e.Handler ist in der Tat eine Klasse Art von FirstOuterClass $ FirstInnerClass. Also entweder gibt es Unterschiede in Gießen zwischen C # und Java (möglich) oder ich bin nicht die richtige Syntax irgendwo bieten (auch möglich).
(Es tut mir leid für die nicht den ganzen Code einfügen, wie das, was die HashMaps sind. Ich will nicht das wirkliche Problem verwirren. Im Grunde ist es eine Zuordnung zwischen einem String-Schlüssel und ein paar Klassen, die abstrakte erweitern A).
Lösung
Wenn einer Ihrer inneren Klassen wurde gegossen, um A
versagt, dann Ausnahme aussehen würde:
java.lang.ClassCastException: FirstOuterClass $ FirstInnerClass kann nicht auf A gegossen werden
Stattdessen Sie bekommen diese:
java.lang.ClassCastException: java.lang.Class
Schneiden Sie weg am Ende dieses „nicht zu gieße A werden“?
Unabhängig davon, scheint es, dass e.Handler
vom Typ java.lang.Class
ist. Wie in, FirstOuterClass$FirstInnerClass
selbst eher als eine einzige Instanz davon.
Andere Tipps
Von der Ausnahmemeldung, es scheint, dass Sie versuchen, eine Instanz von Class
zu werfen, nicht eine Instanz der Klasse repräsentiert es.