有两个班级
foo.bar.FileUploader
和barbar.foofoo.FileUploader
两者都相同并扩展Uploader
代码中的某处使用了foo.bar.FileUploader
,并将其作为Uploader
类型的函数作为参数提供。
现在我需要将其转发回FileUploader
但barbar.foofoo.FileUploader
。这给出了一个错误:
错误 - 未处理的错误
java.lang.ClassCastException
: 无法投射foo.bar.FileUploader
到barbar.foofoo.FileUploader
我无法弄清楚出了什么问题,我想这是因为包装不同。在这种情况下:有没有办法继续使用该类并完成演员表?
答案 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解决了这个问题。现在运行正常!