Java 向上投射时的ClassCastException
我有两个类:子编辑器和编辑器Java 向上投射时的ClassCastException,java,casting,classcastexception,Java,Casting,Classcastexception,我有两个类:子编辑器和编辑器 公共类子编辑器扩展了编辑器{ 我正在创建一个SubEditor对象并试图将其强制转换为Editor,但我将得到一个ClassCastException: try { (Editor) ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance(); } catch (Exception ex) { try { Object object = Cla
公共类子编辑器扩展了编辑器{
我正在创建一个SubEditor对象并试图将其强制转换为Editor,但我将得到一个ClassCastException:
try {
(Editor) ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance();
} catch (Exception ex) {
try {
Object object = ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance();
// prints "false":
System.out.println(object instanceof Editor);
// prints "bla.SubEditor":
System.out.println(object.getClass().getCanonicalName());
// prints "Super: bla.Editor":
System.out.println("Super: "+object.getClass().getSuperclass().getCanonicalName());
} catch (Exception e) {
// do sth
}
}
我怎么可能在“编辑器的子编辑器实例”中得到“false”
例外情况:
try {
(Editor) ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance();
} catch (Exception ex) {
try {
Object object = ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance();
// prints "false":
System.out.println(object instanceof Editor);
// prints "bla.SubEditor":
System.out.println(object.getClass().getCanonicalName());
// prints "Super: bla.Editor":
System.out.println("Super: "+object.getClass().getSuperclass().getCanonicalName());
} catch (Exception e) {
// do sth
}
}
java.lang.ClassCastException:bla.SubEditor不能强制转换为bla.Editor
希望你能帮忙
您好
Martin这两个类可能是使用不同的类加载器实例加载的 我认为您可以通过比较两个类装入器来检查是否存在这种情况:
Editor.getClassLoader().equals(ClassLoader.getSystemClassLoader())
使用不同的类加载器会导致两个不同的
class
对象,因此出现ClassCastException
JSonEditor或SubEditor?这很混乱。抱歉,我是说SubEditor。更新了我的描述事实上,你是对的。但怎么可能呢?这两个类都是在Eclipse创建的同一个可运行库上的。我从来没有使用过SubEditor在Netbeans下开发时会出现这样的问题…我不确定,也许如果你能发布更多的细节,它会更清楚。至于你的问题的解决方案,似乎是Editor.getClassLoader().loadClass(“bla.SubEditor”)
,而不是(Editor)ClassLoader.getSystemClassLoader().loadClass(“bla.SubEditor”)
应该可以,谢谢!我发现eclipse使用类加载器java.net.URLClassLoader
,而系统类加载器是sun.misc.Launcher.AppClassLoader
的一个实例。非常感谢;但这也意味着我可以加载两个同名的类(例如,由不同的类加载器执行的类bla.SubEditor
)的2倍?这正是导致问题的原因,因此是的,这是可能的