4

我有一个超类,我想重写这两个方法。这是我的代码:

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

4 回答 4

17

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

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 本身倾向于大量使用装饰器模式

于 2010-11-23T21:07:55.540 回答
0

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

于 2010-11-23T21:06:48.540 回答
0

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

object = new MyCustomClass(blahblah);

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

于 2010-11-23T23:38:57.560 回答
0

从我所看到的看来,MyCustomClass.item(blahblah) 调用返回的东西(可能是父级)与 MyCustomClass 不同。它是 te 代码中唯一的部分,您在其中投射对象......

于 2010-11-23T21:10:14.310 回答