簡體   English   中英

返回類型與繼承的方法不兼容

[英]The return types are incompatible for the inherited methods

  class A {
        public A get() { }
 }

 class B extends A {

 }

返回類型與繼承方法不兼容,如何解決這個問題?

從JDK 5開始,Java允許您更改被重寫方法的返回類型,只要新類型是原始類型的子類。 這稱為協變返回類型 以下代碼將正確編譯:

class A {

    A get() {
        return new A();
    }

    void sayHello(){
        System.out.println("Hello");    
    }
}

class B extends A {

    @Override
    B get() {
        return new B();
    }

    void sayGoodbye(){
        System.out.println("Goodbye");
    }
}

class Test{
    void check(){
        B two=new B();
        two.get().sayGoodbye();
    } 
}

請記住,重寫方法的返回類型應該是返回類型的子類,以允許您在A變量上調用方法並獲取有效的A對象(實際上是B實例):

        void check(){
            A two=new B();
            A copy=two.get();
            copy.sayHello();
        }   

使用泛型:

 class A<T extends A> {
        public T get() { }
 }

 class B extends A<B> {

 }

B b = new B();
B got = b.get();

我假設你想寫一些像B b = new B().get(); 沒有明確的類型轉換,如Nikita Beloglazov建議,盡管這不是Java支持的成語。 Eugene的答案運作得很好,盡管這仍然涉及對T的強制轉換並且還會產生一個丑陋的編譯器警告。 就個人而言,我會編寫更像以下代碼:

class A {
    private A() {}

    public A get() {
        return new A();
    }
}

class B extends A {
    private B() {}

    @Override
    public A get() {
        return new B();
    }

    public B getB() {
        return (B) get();
    }
}

你仍然不能做B b = new B().get(); ,但你可以做B b = new B().getB(); ,無論如何,這都是一樣簡單和自我記錄,因為你已經知道你想要一個B對象,而不僅僅是任何A對象。 並且A a = new B().get(); 會創建一個B對象,盡管只能訪問A聲明的方法。

暫無
暫無

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

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