オーバーライドされたメソッドが、オーバーライドされたメソッドの引数のサブクラスを引数として取るようにしたい場合は、通常、ジェネリックを使用してそれを実現します( で説明されているように、オーバーライドされたメソッドのさまざまな入力タイプのテンプレートパターン )。その例は、クラスmethodA
とParent
のChild
にあります。
クラス自体のオブジェクトを引数として取るメソッドを使用して同じことを実行できるかどうか疑問に思っています(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) {}
}
_
上記のコードでは、methodB
のChild
はmethodB
のParent
をオーバーライドしません。
もちろん、次のようにmethodB
からChild
にキャストすることもできます。
_public class Child extends Parent<Sub> {
@Override
void methodB(Parent<Sub> child) {
(Child) child
}
}
_
ただし、原則として、できるだけキャストしないようにしています。
上書きされたmethodB
をChild
に含めることは可能ですか(署名@Override void methodB(Child child)
を使用)?その場合、methodB
(Parent
内)の署名はどのようになりますか?
あなたが望むものが可能だったとしましょう。別の子クラスを作ってみましょう:
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);
child
はParent<Sub>
型のポインタであるため、methodB
はParent<Sub>
型の引数を期待しています-child2
もタイプParent<Sub>
のポインター。しかし、child
が参照するオブジェクトはタイプChild
であり、それはmethodB
がタイプChild
の引数のみを受け入れ、そしてchild2
が指しているタイプChild2
のオブジェクト-Child
...のサブクラスではありません.