在Java中,对象何时无法强制转换到其父类?
我和你有同样的问题。但是,我最大的问题不是问题本身,而是错误日志中的异常:在Java中,对象何时无法强制转换到其父类?,java,casting,javac,tools.jar,Java,Casting,Javac,Tools.jar,我和你有同样的问题。但是,我最大的问题不是问题本身,而是错误日志中的异常: java.lang.ClassCastException: com.sun.tools.javac.api.JavacTrees cannot be cast to com.sun.source.util.Trees 通过研究这个问题,我发现JavacTrees是DocTrees的子类,DocTrees是树的子类。具体而言,类定义如下: 公共类JavacTrees扩展DocTrees{ // ... } 公共抽象类Do
java.lang.ClassCastException: com.sun.tools.javac.api.JavacTrees cannot be cast to com.sun.source.util.Trees
通过研究这个问题,我发现JavacTrees
是DocTrees
的子类,DocTrees
是树的子类。具体而言,类定义如下:
公共类JavacTrees扩展DocTrees{
// ...
}
公共抽象类DocTrees扩展了树{
// ...
}
公共抽象类树{
// ...
}
上面的ClassCastException
基本上意味着一个对象未能强制转换到其父类中。在我读过的任何教科书中,我都不记得有这样的内容
谁能给我解释一下这个例外情况吗?谢谢。谢谢@ohgodspides提供有关ClassLoader
s的提示。我使用调试器检查了JavacTrees
和Trees
的类加载器,结果如下:
com.sun.tools.javac.api.JavacTrees
由加载
com.sun.source.util.Trees
已由加载
因此,这两个类由不同的ClassLoader
s加载。因此,它将无法从JavacTrees
转换到树
,即使Trees
是JavacTrees的父类,哪行抛出异常?这听起来像是类加载器问题。如果这两个类由不同的类装入器装入,则在它们之间转换将不起作用。这个问题似乎是关于一个类似的问题(也是一个可能的解决方案):@ohgodspeiders“如果由不同的类装入器装入的两个类在它们之间不起作用。”对不起,我不熟悉类装入器。请问是否有一个指针让我看到这句话?谢谢。@OhGodspeds我做了一个快速演示来测试这个行为:。谢谢