4

私はオーバーライドしたい2つのメソッドを持つスーパークラスを持っています。これが私のコードです:

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 をオーバーライドして、OtherConstructor で使用する SomeSuperClass オブジェクトを取得するにはどうすればよいでしょうか? 重要な場合、このコードは 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 自体はDecorator パターンを多用する傾向にあります。

于 2010-11-23T21:07:55.540 に答える
0

問題が解決したようです。私は試した

object = new MyCustomClass(blahblah);

そしてそれはうまくいきました。ところで、誰かがそれを説明できますか?

于 2010-11-23T23:38:57.560 に答える
0

私が見るところ、 MyCustomClass.item(blahblah) 呼び出しは MyCustomClass とは異なるもの (おそらく親) を返すようです。オブジェクトをキャストしているコードの唯一の部分です...

于 2010-11-23T21:10:14.310 に答える
0

item()メソッドが で宣言されている場合、SomeSuperClassそれが のインスタンスを返しているとは思えませんMyCustomClass。したがって、キャスト(MyCustomClass) MyCustomClass.item(blahblah)は無効になります。

于 2010-11-23T21:06:48.540 に答える