6

Java で継承されたメソッドの戻り値の型について質問があります。クラスと継承されたクラスがあります。継承されたクラスには、特定のメソッドがあります。また、それ自体のインスタンスを返す親クラスからメソッドを継承します。

このクラス階層のようなものが欲しい:

public class Foo {
    public Foo bar()
    {
        return this;
    }
}

public class FooInherited extends Foo {
    public Whatever baz()
    {
        return new Whatever();
    }
}

私の質問は、継承されたメソッドをそのインスタンスから呼び出してから、メソッドをオーバーライドして継承されたクラスを返したり、クラスを明示的にキャストしたりせずに特定のメソッドを呼び出すことができるかどうかです。

今、私はこのようなコードフラグメントを持ちたいです:

FooInherited foo = new FooInherited();
Whatever w = foo.bar().baz();

これには難しさを感じますが、Java がそのような状況でプログラマーの時間を節約するメカニズムを備えているかどうかはよくわかりません。

4

3 に答える 3

5

ジェネリックを使用できますが、すぐに醜くなります。

class Base<This extends Base<This>> {

    public This myself() {
        return (This) this;
    }

}

class Sub<This extends Sub<This>> extends Base<This> {

    public void subOnly() {}

}

{
    Sub<?> sub = new Sub<>();
    sub.myself().subOnly();
    Base<?> base = sub;
    // base.myself().subOnly(); // compile error
}

別の方法は、メソッドを明示的にオーバーライドすることです。

class Base {

    public Base myself() {
        return this;
    }

}

class Sub extends Base {

    @Override
    public Sub myself() {
        return this; // or return (Sub) super.myself();
    }

    public void subOnly() {}

}

{
    Sub sub = new Sub();
    sub.myself().subOnly();
    Base base = sub;
    // base.myself().subOnly(); // compile error
}
于 2012-10-26T09:42:15.733 に答える
1

foo.bar()Fooはインスタンスを返し、 as という名前のメソッドbaz()がないため、このステートメントをコンパイルすることはできません。Whatever w = foo.bar().baz();

于 2012-10-26T09:42:22.313 に答える