【问题标题】:ClassCastException for implements class实现类的 ClassCastException
【发布时间】: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


【解决方案1】:

听起来你确实有类加载器问题。您是从多个捆绑包中导出同一个包,还是嵌入一个类/包并将其导出到其他地方?

一个建议是始终导入您导出的内容。这样,所有包都会从同一个包中导入每个类,并且您的类转换应该可以工作。

有用的博文: http://blog.osgi.org/2007/04/importance-of-exporting-nd-importing.html

【讨论】:

  • 是的,这就是问题所在。我在我的 maven 存储库中为带有 Apple 类和接口 Beet 的 jar 提供了一个依赖项。请注意,我将此 jar 标记为已提供。然后在我的 maven 项目中,我给出了在运行时导入带有这些类的包的说明。对我来说工作正常。 :) 感谢所有的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多