在Java中,一个对象什么时候无法转换为其父类



我在使用jaxb-ri-2.2.7的ant schemagen任务中遇到了与ClassCastException相同的问题。然而,我最大的问题不是问题本身,而是错误日志中的异常:

java.lang.ClassCastException: com.sun.tools.javac.api.JavacTrees cannot be cast to com.sun.source.util.Trees

通过研究这个问题,我发现JavacTreesDocTrees的子类,DocTreesTrees的子类。具体而言,类定义为:

public class JavacTrees extends DocTrees {
// ...
}
public abstract class DocTrees extends Trees {
// ...
}
public abstract class Trees {
// ...
}

上面的ClassCastException基本上意味着一个对象未能转换到其父类中。我不记得我读过的任何一本教科书中有这样的内容。

有人能向我解释一下这个例外吗?谢谢

感谢@OHGODSIDERS提供有关ClassLoaders的提示。我使用调试器检查了JavacTreesTrees的类加载器,结果如下:

  • com.sun.tools.javac.api.JavacTreesjava.net.FactoryURLClassLoader加载
  • com.sun.source.util.Treesorg.codehaus.plexus.classworlds.realm.ClassRealm加载

因此,这两个类由不同的ClassLoaders加载。因此,即使TreesJavacTrees的父类,它也无法从JavacTrees转换为Trees

相关内容

  • 没有找到相关文章

最新更新