web-dev-qa-db-ja.com

引数としてサブクラスを使用してメソッドをオーバーライドする

オーバーライドされたメソッドが、オーバーライドされたメソッドの引数のサブクラスを引数として取るようにしたい場合は、通常、ジェネリックを使用してそれを実現します( で説明されているように、オーバーライドされたメソッドのさまざまな入力タイプのテンプレートパターン )。その例は、クラスmethodAParentChildにあります。

クラス自体のオブジェクトを引数として取るメソッドを使用して同じことを実行できるかどうか疑問に思っています(my methodB

_abstract class Super {}

class Sub extends Super {}

abstract class Parent<S extends Super> {
    abstract void methodA(S argument);
    abstract void methodB(Parent<S> parent);
}

public class Child extends Parent<Sub> {
    @Override
    void methodA(Sub argument) {}

    @Override
    void methodB(Child child) {}
}
_

上記のコードでは、methodBChildmethodBParentをオーバーライドしません。

もちろん、次のようにmethodBからChildにキャストすることもできます。

_public class Child extends Parent<Sub> {
    @Override
    void methodB(Parent<Sub> child) {
        (Child) child
    }
}
_

ただし、原則として、できるだけキャストしないようにしています。

上書きされたmethodBChildに含めることは可能ですか(署名@Override void methodB(Child child)を使用)?その場合、methodBParent内)の署名はどのようになりますか?

3
Maarten Dhondt

あなたが望むものが可能だったとしましょう。別の子クラスを作ってみましょう:

public class Child2 extends Parent<Sub> {
    @Override
    void methodA(Sub argument) {}

    @Override
    void methodB(Child2 child) {}
}

今、私がこれを持っているとどうなりますか:

Parent<Sub> child = new Child();
Parent<Sub> child2 = new Child2();
child.methodB(child2);

childParent<Sub>型のポインタであるため、methodBParent<Sub>型の引数を期待しています-child2もタイプParent<Sub>のポインター。しかし、childが参照するオブジェクトはタイプChildであり、それはmethodBがタイプChildの引数のみを受け入れ、そしてchild2が指しているタイプChild2のオブジェクト-Child...のサブクラスではありません.

4
Idan Arye