Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向上投射时的ClassCastException_Java_Casting_Classcastexception - Fatal编程技术网

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倍?这正是导致问题的原因,因此是的,这是可能的