簡體   English   中英

Java繼承了返回類型

[英]Java inherited return type

我有一個關於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是否在這種情況下為程序員提供了任何節省時間的機制。

你可以使用泛型,但它會很快變得難看。

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
}

除非你重寫子類中的方法,否則你必須強制轉換:

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

但是,由於java中的協變返回類型 ,您可以像這樣覆蓋它:

public class FooInherited extends Foo {


        @Override
        public FooInherited bar()
        {
            return this;
        }
 ...
 }

覆蓋之后,你不再需要進行FooInherited因為foo的靜態類型是FooInherited

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

foo.bar()返回一個Foo實例,它沒有名為baz() ,所以不可能編譯這個語句: Whatever w = foo.bar().baz();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM