我有一个超类,我想要覆盖两个方法。这是我的代码:
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应用程序。
答案 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);
它有效。 顺便说一句,有人可以解释一下吗?