如何在Java中使用其他包来构建相同类的类型?

时间:2010-07-21 08:14:21

标签: java casting

有两个班级

foo.bar.FileUploaderbarbar.foofoo.FileUploader

两者都相同并扩展Uploader

代码中的某处使用了foo.bar.FileUploader,并将其作为Uploader类型的函数作为参数提供。

现在我需要将其转发回FileUploaderbarbar.foofoo.FileUploader。这给出了一个错误:

  

错误 - 未处理的错误   java.lang.ClassCastException:   无法投射foo.bar.FileUploader   到barbar.foofoo.FileUploader

我无法弄清楚出了什么问题,我想这是因为包装不同。在这种情况下:有没有办法继续使用该类并完成演员表?

6 个答案:

答案 0 :(得分:7)

从技术上讲,他们不是同一个班级。

您将获得ClassCastException,因为JVM根本看不到它们是相同的类型。也许你应该让两个类实现相同的接口并转换为它?或者,首先只有一个类并摆脱演员?

答案 1 :(得分:5)

对于Java,这些类并不相同。考虑一下这个

package zoo;
public interface Animal {}

package zoo.london;
public class Lion implements Animal{}

package zoo.newyork;
public class Lion implements Animal{}

即使两个Lion类的实现相同且它们都实现了一个公共接口,也不能像

那样反之亦然。
zoo.london.Lion lion = (zoo.london.Lion) new zoo.newyork.Lion();  // ClassCastException

答案 2 :(得分:2)

两个类foo.bar.FileUploader和barbar.foofoo.FileUploader与它们在具有不同名称的不同位置中定义的NOYT相同。因此java认为它们彼此没有关系,

如果你想要相同,那么你必须制作相同的类,即跨包导入。开始重构以使其中一个扩展另一个可能是最容易的。

答案 3 :(得分:2)

其他人已经说过:这些课程不一样,只是因为它们看起来像。 类是否实现/扩展相同的接口/抽象类?转换为扩展的接口或抽象类并使用它。您尝试做的事情根本不受JVM支持。 JVM不关心类是否相同。如果它们真的是100%完全相同,那么它显然是一个混乱的设计,删除其中一个类。

Java Language Specification准确描述了您允许投射的内容以及不允许播放的内容。

答案 4 :(得分:1)

摆脱重复的代码。即使它现在可以工作,因为两个类都是相同的,如果有人编辑了A类并忘记了B类会怎么样?

编辑:你说它们是相同的,所以我猜它们是副本。那会很糟糕。但由于它们都延伸Uploader,您可以转为Uploader而不是FileUploader

答案 5 :(得分:-1)

感谢帮助人们。

我刚刚通过导入barbar.foofoo.FileUploader解决了这个问题。现在运行正常!