Java 是否可以将类型转换为父抽象类?
我正在将一个C#项目移植到Java中。我有一段代码如下所示:Java 是否可以将类型转换为父抽象类?,java,casting,abstract-class,classcastexception,Java,Casting,Abstract Class,Classcastexception,我正在将一个C#项目移植到Java中。我有一段代码如下所示: public abstract class A { public abstract void foo() throws Exception; public abstract void bar(); } 然后,在其他地方 public class FirstOuterClass { public class FirstInnerClass extends A { // def
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()
}
}
再往别处
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确实是FirstOuterClass$FirstInnerClass的类类型。因此,要么C#和Java之间在强制转换方面存在差异(可能),要么我没有提供正确的语法(也可能)
(我很抱歉没有像HashMaps那样粘贴整个代码。我不想混淆真正的问题。基本上,这是一个字符串键和几个扩展抽象a的类之间的映射。)从异常消息中,似乎您正试图强制转换
类的实例,不是它所表示的类的实例。如果您的一个内部类未能强制转换到A
,则您的异常将如下所示:
java.lang.ClassCastException:FirstOuterClass$FirstInnerClass不能强制转换为
相反,您得到的是:
java.lang.ClassCastException:java.lang.Class
你是否在结尾处删掉了“不能被铸造成A”
无论如何,似乎e.Handler
属于java.lang.Class
类型。与中一样,FirstOuterClass$FirstInnerClass
本身,而不是它的单个实例。看起来不错,但为什么e.Handler的静态类型不是一个,所以您可以避免强制转换,并从其源代码处获得问题?您能否提供有关HashMapOfStringToEntry的更多数据?您的foreach循环令人困惑。Map返回条目,您正在使用其他内容。看起来它返回了Entry的本地实现,这在这里可能会有所帮助。你是对的,但我不知道为什么。如果我对e.Handler进行instanceof检查,我会将其设置为java.lang.Class——它不会将自己标识为子类……事实上,我想我得到了它,正如你所说的。我没有对象的实例化;实际上,我只是通过了e.Handler.class。有没有一种方法可以比较非实例化对象的类继承。需要我的类来实现java.lang.reflect.Type并将类正确实例化为对象。很抱歉,我的3条评论似乎无法编辑。标记作为答案。谢谢大家!@GJT:提交评论后,您只能在短时间内编辑评论。编辑期结束后,请记住,您仍然可以随时删除自己的评论。