【发布时间】:2014-10-05 00:46:17
【问题描述】:
这个问题与can't cast to implemented interface 中的问题非常相似。 Classloader issues - How to determine which library versions (jar-files) are loaded
我有一个实现 Beet 的 Apple 类。甜菜延伸胡萝卜
Carrot c= x.getCarrot();
c.getClass() //returns Apple
c.getClass().getInterfaces()[0] //returns Beet.
我想访问 Apple 内部的方法。所以我所做的就是将 c 转换为 Beet。
Beet b=(Beet)c;
此时我收到了ClassCastException。我认为这是由于上述链接中讨论的 ClassLoader 问题。
但我不明白如何解决这个问题。我不太了解 OSGi,也不知道如何引用捆绑包。有人可以向我解释如何解决这个问题和一个好的参考点。
【问题讨论】:
-
你能用有意义的类/接口重申你的问题吗?甜菜不是胡萝卜。苹果不是可以做“甜菜”的东西。也许 Apple -> Human (class), Beet -> Thinking (interface), Carrot -> Living (interface)
-
您的 OSGi 捆绑包是如何设置的? Beet/Carrot/Apple 分别属于哪些 bundle,它们与运行此代码的 bundle 有什么关系?
-
正如您提到的帖子所暗示的,当您运行
c.getClass().getInterfaces()[0].getClassLoader();、Beet.class.getClassLoader();、Carrot.class.getClassLoader();时,您得到了什么?这将有助于确定这是否真的是类加载器问题。 -
代码没有错。演员表不违反类层次结构。你的 Java 版本/执行环境是什么
-
@isim 这里是输出 c.getClass().getInterfaces()[0].getClassLoader())-->[5] c.getClass().getClassLoader())--> [5] b.getClass().getClassLoader())-->[7]
标签: java classloader classcastexception