2010-11-23 13 views
3

私は上書きしたい2つのメソッドのスーパークラスを持っています。ここに私のコードです:私はいくつかのコンストラクタを持っている拡張スーパークラスとClassCastException

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 

右のようですが、私は、Javaを取得していますこと。実行中のSomeSuperClassでlang.ClassCastExceptionが発生しました。

SomeSuperClassObjectを作成すると、オーバーライドされたメソッドが失われます。

キャストすると、eclipseにエラーがなくてもアプリケーションがクラッシュします。 つまり、私はSomeSuperClassを自分のメソッドでオーバーライドでき、SomeSuperClassオブジェクトをOtherConstructorと共に使用することができますか? 重要な場合は、このコードはAndroidアプリ向けです。

+3

「MyCustomClass.item」のコードは何ですか? – Powerlord

+0

これはオーバーライドされていないので、スーパークラスメソッド – artemy

+0

を使用するだけで、 'MyCustomClass.item()'はコンストラクタでも 'OtherConstructor.object() ' –

答えて

0

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

+0

なぜですか?もし彼がコンパイル時に両方のbotchクラスを持っていれば、親クラスの静的メソッドitem()は特定のサブクラスインスタンスを返すことができます(単純なファクトリメソッドのようなものです)... – malejpavouk

+0

はい、そうです;私はむしろそれを疑う。私は言い換える。 –

15

一般的なルールとして、あなたはその親クラスにサブクラスのインスタンスをキャストすることができます

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

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

しかし、あなたはサブクラスにスーパークラスのインスタンスをキャストすることはできませんこれは、MyCustomClassオブジェクトもSomeSuperClassオブジェクトですが、すべてSomeSuperClassオブジェクトがMyCustomClassオブジェクトではないためです。

特定のデザインパターンでこの問題を回避することができます。 Java自体はDecorator patternを使用する傾向があります。

+0

私はいつも正しい方向を忘れています。これは役に立ちます。 –

0

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

+0

はい、それはSomeSuperClassオブジェクト – artemy

+0

を返しますので、問題は、親インスタンスを子にキャストできません。継承構造はIS言語構造に変換できます。あなたの場合、哺乳動物(スーパークラス)とヒト(サブクラス)とウサギのサブクラスがあります。あなたは人間hを作成し、「哺乳動物(哺乳動物m =新しい人間)」と言うことができますが、すべての哺乳動物は人間であるとは言えません(哺乳動物m =新しい習慣、人間h =(人間)m)...あなたが何をしているのか、なぜあなたはクラスキャスト例外を持っているのですか... ... – malejpavouk

+0

私はそれを見て少し違う間違いをしました...あなたは人間h =新しいMammal()ですが、哺乳動物(あなたのスーパークラス)は4本の足を持ち、人間は2本の足と2本の足を持っています...親への参照を子にキャストできません....親参照に子オブジェクトが含まれている場合のみこの人間は哺乳類です - この具体的な哺乳動物は、人間です。この哺乳類は人間です。 – malejpavouk

0

問題を解決したようです。試しました

object = new MyCustomClass(blahblah); 

となりました。 ところで、誰か説明できますか?

関連する問題