在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我做了一个快速演示来测试这个行为:。谢谢