我正在将C#项目移植到Java中。我有一大堆代码看起来像这样:
public abstract class A
{
public abstract void foo() throws Exception;
public abstract void bar();
}
然后,其他地方......
public class FirstOuterClass {
public class FirstInnerClass extends A {
// defines foo() and bar()
}
}
其他地方......
public class SecondOuterClass {
public class SecondInnerClass extends A {
// defines foo() and bar()
}
}
最后,在其他地方甚至更多......
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可以是FirstInnerClass或SecondInnerClass的类型。这是e.Handler与(A)的对话导致以下错误:
java.lang.ClassCastException: java.lang.Class
我已经通过调试输出验证了e.Handler确实是FirstOuterClass $ FirstInnerClass的类类型。所以要么在C#和C&C之间存在差异。 Java(可能)或我没有在某处提供正确的语法(也可能)。
(我很抱歉没有粘贴整个代码,就像HashMaps的用途一样。我不想混淆真正的问题。基本上它是一个String键和几个扩展抽象的类之间的映射甲。)
答案 0 :(得分:3)
如果您的某个内部类未能转换为A
,那么您的异常将如下所示:
java.lang.ClassCastException:FirstOuterClass $ FirstInnerClass无法强制转换为A
相反,你得到了这个:
java.lang.ClassCastException:java.lang.Class
你是否在这结束时切断了“不能被投到A”?
无论如何,e.Handler
似乎属于java.lang.Class
类型。如同FirstOuterClass$FirstInnerClass
本身而不是它的单个实例。
答案 1 :(得分:0)
从异常消息中,您似乎正在尝试转换Class
的实例,而不是它所代表的类的实例。