web-dev-qa-db-ja.com

親クラスから子へのオブジェクトの型キャスト

Java言語での型キャストについて誤解があります。問題は ClassCastException。たとえば、このコードでは、AnimalがDogクラスの親クラスであると想定して、

動物動物= new Animal();
犬犬=(犬)動物;

投げる ClassCastException 実行後。ただし、Androidパッケージを勉強しているときに、型キャストに関する例を見つけました。 ClassCastExceptionJavaの例。

EditText editText =(EditText)findViewById(R.id.edit_message);

このコードでは、 findViewById メソッドは 見る のスーパークラスの1つであるクラスオブジェクト EditText クラス。 Android.view.View に Android.widget.EditText)コードは正常に実行されます。私がミスを犯したかどうか、またはこれがどのように発生したかについて誰かが説明できますか?

前もって感謝します。

14
mwb

オブジェクトを作成すると、そのタイプを変更することはできません。そのため、動物を犬にキャス​​トすることはできません。

ただし、サブクラスのオブジェクトを作成する場合は、スーパークラスタイプの変数にそのオブジェクトへの参照を保持し、後でサブクラスタイプにキャストできます。

これは動作します:

Animal a = new Dog ();
Dog d = (Dog) a;

Androidの例では、次のようなレイアウトリソースがあります。

<EditText
    Android:id="@+id/edit_message"
 ..."/>

この定義により、AndroidはEditTextのインスタンスを作成するため、findViewByIdから返されたビューをEditTextにキャストできます。 EditTextのスーパータイプではない他のものにキャストすることはできません。

20
Eran

基本的に、サブクラスのインスタンスはまだ不明であるため、スーパークラスのインスタンスをサブクラスにキャストすることはできません。アップキャスティングは、コードにポリモーフィズムを処理するため、この例外の発生を防ぐ確実な方法です。

最初にサブクラスをインスタンス化する必要があります。

Dog dog = new Dog;

スーパークラスにキャストすることで、親クラスである動物に見つからないクラスDogのメソッドを非表示にすることができます。

Animal animal = (Animal) dog;

次に、サブクラスのインスタンスがすでにわかっているため、これをサブクラスDogにダウンキャストできます。

Dog anotherDog = (Dog) animal;
3
Ritchie Borja

あなたはこれを試すことができます:

Base obj= new Derived();
Derived obj2= (Derived)obj;

これがお役に立てば幸いです。

1
Yash
public class OverridingConcept {
    public static void main(String[] args) {
        // Up-Casting
        Parent p = new Child();
        Child c = (Child) p;
        c.eat();
    }
}
class Parent {
    void show() {
        System.out.println("Parent.Show");
    }
    void eat() {
        System.out.println("Parent.Eat");
    }
}
class Child extends Parent {
    void show() {
        System.out.println("Child.Show");
    }
    void sing() {
        System.out.println("Child.Sing");
    }
}
0