是否可以将铸件键入父母抽象类?
-
29-09-2019 - |
题
我正在将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。正是(a)的对话e.handler引起了以下错误:
java.lang.ClassCastException: java.lang.Class
我已经验证了调试输出,E.Handler确实是firstouterClass $ firstInnerClass的类型。因此,要么在c#&java(可能)之间存在差异,要么我没有在某处提供正确的语法(也可能)。
(很抱歉不粘贴整个代码,就像哈希图的目的一样。我不想混淆真正的问题。基本上,这是字符串键和几个类别的映射,可以扩展抽象A。)
解决方案
如果您的一个内部课程未能投射到 A
, ,那么您的例外看起来像:
java.lang.classcastException:firstouterClass $ firstInnerClass不能铸造
相反,您得到了这个:
java.lang.classcastException:java.lang.class
在此结束时,您是否切断“不能被铸成”?
无论如何,似乎 e.Handler
是类型 java.lang.Class
. 。如 FirstOuterClass$FirstInnerClass
本身而不是一个实例。
其他提示
从异常消息来看,您似乎正在尝试施放一个实例 Class
, ,不是其代表的类的实例。
不隶属于 StackOverflow