1

Javathisで、抽象クラスのメソッド内で、抽象クラスだけでなく、手元のサブクラスのインスタンスとして使用することは可能ですか?

abstract class MyAbstractClass <MyImplementingClass extends MyAbstractClass> {

    public abstract MyImplementingClass self();
}

すべてのサブクラスで上書きします

class MyImplementingClass extends MyAbstractClass<MyImplementingClass> {

    @Override public MyImplementingClass self() {
        return this;
    }
}

しかし、これを行うためのより洗練された方法があるのだろうか。特に、すべてのサブクラスが。のようなルーチンを上書きする必要がないものself()

4

3 に答える 3

3

ここでの問題は、メソッドがではなく をself()返すことだと思います。MyImplementingClassMyAbstractClass

を返す必要があります。返されるオブジェクトMyAbstractClass動的タイプは関連するものになります。

また、なぜ使用しないのですthisか?呼び出された場所に関係なく、正しい動的タイプでオブジェクト自体を返します。必要に応じてキャストできます

于 2012-09-13T06:21:17.633 に答える
1

Java でメソッドをオーバーライドする場合、戻り値の型を元の型のサブクラスにオーバーライドできます。このコードは完全に有効です:

abstract class MyAbstractClass {

    public MyAbstractClass self() {
        return this;
    }
}

そして具象クラス:

class MyImplementingClass extends MyAbstractClass {

    @Override
    public MyImplementingClass self() {
        return this;
    }
}

clone()これは、単にではなく正確な型を返すようにオーバーライドできる理由でもありますObject

public class SomeCloneable implements Cloneable {

    @Override
    public SomeCloneable clone() {
        return new SomeCloneable();
    }
}
于 2012-09-13T06:01:29.697 に答える
0

クラスを返しnewInstance()てそのように振る舞うことができると思います

@Override public MyImplementingClass self() {
    return MyImplementingClass.newInstance();
}
于 2012-09-13T05:58:38.013 に答える