扩展超类和ClassCastException

时间:2010-11-23 21:00:03

标签: java casting override classcastexception superclass

我有一个超类,我想要覆盖两个方法。这是我的代码:

public class MyCustomClass extends SomeSuperClass {

protected MyCustomClass(params) {
    super(params);
}
@Override
public void method1() {
    super.method1();
    /* here goes my code */
}
@Override
public void method2() {
    super.method2();
    /* here goes my another code  */
}

我有一些构造函数,它将SomeSuperClass对象作为参数传递,我接下来会做什么:

MyCustomClass object;
/* now i have object of type SomeSuperClass,
but with my own method1() and method2() */
object = (MyCustomClass) MyCustomClass.item(blahblah); 
/* eclipse suggests casting, because MyCustomClass.item()
 constructor still returns SomeSuperClass object */
otherobject = OtherConstructor.object(object);
//OtherConstructor passes SomeSuperClass object 

这似乎是正确的,但我在执行时会在SomeSuperClass中获得java.lang.ClassCastException。

如果我创建SomeSuperClassObject,我将丢失我的覆盖方法。

使用强制转换,即使eclipse中没有错误,应用程序也会崩溃。 换句话说,我如何使用自己的方法覆盖SomeSuperClass,并仍然使用SomeSuperClass对象与OtherConstructor一起使用? 如果它很重要,此代码适用于Android应用程序。

4 个答案:

答案 0 :(得分:16)

作为一般规则,您可以将子类的实例强制转换为其父类:

MyCustomClass object = new MyCustomClass(params);
SomeSuperClass superClass = (SomeSuperClass) object;

但是,您无法将超类的实例强制转换为子类:

SomeSuperClass object = new SomeSuperClass(params);
MyCustomClass customClass = (MyCustomClass) object; // throws ClassCastException

这是因为MyCustomClass对象也是SomeSuperClass个对象,但并非所有SomeSuperClass个对象都是MyCustomClass个对象。

您可以使用某些设计模式解决此问题。 Java本身倾向于使用Decorator pattern

答案 1 :(得分:0)

如果在item()中声明了SomeSuperClass方法,我怀疑它是否正在返回MyCustomClass的实例。所以你的演员(MyCustomClass) MyCustomClass.item(blahblah)无效。

答案 2 :(得分:0)

从我看来,似乎MyCustomClass.item(blahblah)调用返回的内容与MyCustomClass不同(可能是父级)。它是te代码中唯一的部分,你在那里投射对象......

答案 3 :(得分:0)

看起来问题已经解决了。我试过了

object = new MyCustomClass(blahblah);

它有效。 顺便说一句,有人可以解释一下吗?