1

我在使用 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

通过调查问题,我发现它JavacTrees是 的子类DocTrees,并且DocTrees是 的子类Trees。具体来说,类定义是:

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

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

public abstract class Trees {
    // ...
}

以上ClassCastException基本上意味着一个对象未​​能转换为它的父类。我不记得在我读过的任何教科书中有类似的内容。

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

4

1 回答 1

1

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

因此,这 2 个类由不同ClassLoader的 s 加载。因此它将无法从JavacTreesto 转换Trees,即使Trees是 的父类JavacTrees

于 2021-05-24T07:54:16.847 回答