web-dev-qa-db-ja.com

Javaで親を子にキャストする方法

私はこれをやっています:

Child child = (Child)parent;

これは私にエラーを与えます、私はこのようにすることは不可能であることがわかりました。正確な理由はわかりませんが、可能だと思います。ChildクラスがParentクラスから継承する場合、Parentオブジェクトデータが含まれます。

私の質問は:

  • なぜ動作しないのですか?


  • このようにすべての親の属性を設定せずに、これをどのように機能させることができますか

class Parent{
    public int parameter1;//...
    public int parameter1000;
}

class Child extends Parent
{
    public Child(Parent parent)
{
        this.parameter1 = parent.parameter1;//...
        this.parameter1000 = parent.parameter1000;
}
}
5
likaa

さてあなたはただ行うことができます:

Parent p = new Child();
// do whatever
Child c = (Child)p;

または、純粋なParentオブジェクトから始める必要がある場合は、親クラスにコンストラクターを用意し、次の呼び出しを検討することができます。

class Child{
    public Child(Parent p){
        super(p);
    }
}
class Parent{
    public Parent(Args...){
        //set params
    }
}

または構成モデル:

class Child {
    Parent p;
    int param1;
    int param2;
}

その場合、直接親を設定できます。

Apache Commons BeanUtilsを使用してこれを行うこともできます。そのBeanUtilsクラスを使用すると、リフレクションを介してJavaBeansプロパティを生成するための多くのユーティリティメソッドにアクセスできます。

すべての共通/継承プロパティを親オブジェクトから子クラスオブジェクトにコピーするには、静的copyProperties()メソッドを次のように使用できます。

BeanUtils.copyProperties(parentObj,childObject);

ただし、これは負荷の高い操作です。

6

Fastjsonなど、json utilを使用してこれを行うことができます。

Child child = JSON.parseObject(JSON.toJSONString(parent), Child.class);
0
Edye Chan

子コンストラクターで「this」を「super」に変更し、親パラメーターを削除します。代わりに、それを2つのパラメーターに置き換えますint parameter1; // ... int parameter1000; :)

class Parent{
public int parameter1;//...
public int parameter1000;
}

class Child extends Parent
{
    public Child(int parameter1, int parameter1000)
    {
        super.parameter1 = parameter1
        super.parameter1000 = parameter1000;
    }
}
0
Stephan-MDD