【问题标题】:When will an object fail to cast to its parent class in Java?什么时候对象无法转换为 Java 中的父类?
【发布时间】:2021-05-20 14:18:20
【问题描述】:

我遇到了与ClassCastException in ant schemagen task using jaxb-ri-2.2.7 相同的问题。但是,我最大的问题不是问题本身,而是错误日志中的异常:

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 基本上意味着一个对象无法转换为它的父类。我不记得在我读过的任何教科书中有类似的内容。

有人可以向我解释这个例外吗?谢谢。

【问题讨论】:

  • 哪一行抛出异常?
  • 这听起来像是一个类加载器问题。如果由不同类加载器加载的这两个类在它们之间不起作用。这个问题似乎是关于一个类似的问题(和一个可能的解决方案):stackoverflow.com/questions/25110407/…
  • @OHGODSPIDERS "如果由不同类加载器加载的这 2 个类在它们之间不起作用。"抱歉,我不熟悉类加载器。请问是否有指针让我看到这个声明?谢谢。
  • @OHGODSPIDERS 我做了一个快速演示来测试这种行为:github.com/johnlinp/misc-demo/blob/master/…。谢谢。

标签: java casting javac tools.jar


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2018-04-06
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多