我在使用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
基本上意味着一个对象未能转换到其父类中。我不记得我读过的任何一本教科书中有这样的内容。
有人能向我解释一下这个例外吗?谢谢
感谢@OHGODSIDERS提供有关ClassLoader
s的提示。我使用调试器检查了JavacTrees
和Trees
的类加载器,结果如下:
com.sun.tools.javac.api.JavacTrees
由java.net.FactoryURLClassLoader
加载com.sun.source.util.Trees
由org.codehaus.plexus.classworlds.realm.ClassRealm
加载
因此,这两个类由不同的ClassLoader
s加载。因此,即使Trees
是JavacTrees
的父类,它也无法从JavacTrees
转换为Trees
。