簡體   English   中英

什么是協變返回類型?

[英]What is a covariant return type?

Java 中的協變返回類型是什么? 在面向對象的編程一般?

協變返回,意味着當一個方法重寫時,重寫方法的返回類型允許是被重寫方法返回類型的子類型。

為了用一個例子來澄清這一點,一個常見的情況是Object.clone() - 它被聲明為返回一個Object類型。 您可以在自己的類中覆蓋它,如下所示:

public class MyFoo
{

   ...

   // Note covariant return here, method does not just return Object
   public MyFoo clone()
   {
       // Implementation
   }
}

這里的好處是任何持有對 MyFoo 對象的顯式引用的方法都能夠調用clone()並知道(無需強制轉換)返回值是MyFoo一個實例。 如果沒有協變返回類型,必須聲明 MyFoo 中的重寫方法以返回Object - 因此調用代碼必須顯式向下轉換方法調用的結果(即使雙方都“知道”它只能是MyFoo)。

請注意, clone()沒有什么特別之處,並且任何被覆蓋的方法都可以有一個協變返回——我在這里用它作為例子,因為它是一個標准方法,這通常很有用。

這是另一個簡單的例子:

Animal

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

可以將DogseekFood()方法的返回類型修改為DogFood - Food一個子類,如下所示:

@Override
protected DogFood seekFood() {

    return new DogFood();
}

這是完全合法的覆蓋,並且DogseekFood()方法的返回類型被稱為協變返回類型

從 JDK 1.5 開始,Java 中引入了協變類型。 我會用一個簡單的案例向你解釋:當我們覆蓋一個函數時,該函數被允許改變它的行為,這是你在大多數書中讀到的,但他們{作者}錯過了什么是我們也可以更改返回類型。 檢查下面的鏈接以進行澄清,我們可以更改返回類型,只要它可以分配給方法的 Base 版本的返回類型。

所以這個返回派生類型的特性叫做 COVARIANT ...

重寫的方法可以在返回類型上有所不同嗎?

協變返回類型僅意味着返回自己的類引用或其子類引用。

class Parent {
 //it contain data member and data method
}

class Child extends Parent { 
//it contain data member and data method
 //covariant return
  public Parent methodName() {
     return new Parent();
          or 
     return Child();
  }

}

為了補充上述答案,在協變返回類型之間可以進行覆蓋,其約束是覆蓋方法(子類方法)的返回類型應該是被覆蓋方法(超類方法)的返回類型的子類。 這從 Java 5 開始有效。

協變返回類型指定返回類型可以在與子類相同的方向上變化

class One{  
    One get(){return this;}  
}  

class Two extends One{  
  Two get(){return this;}  

void message(){
  System.out.println("After Java5 welcome to covariant return type");
}  

public static void main(String args[]){  
    new Two().get().message();  
}  
}

在 Java 5 之前,不可能通過更改返回類型來覆蓋任何方法。 但是現在,從 Java5 開始,

如果子類覆蓋任何返回類型為非原始類型的方法,但它將其返回類型更改為子類類型,則可以通過更改返回類型來覆蓋方法。

  • 它有助於避免類層次結構中存在的混淆類型轉換,從而使代碼可讀、可用和可維護。
  • 在覆蓋時我們可以自由地擁有更具體的返回類型
    方法。

  • 幫助防止返回時出現運行時 ClassCastExceptions

參考:www.geeksforgeeks.org

  • java 中的協變返回類型允許縮小覆蓋方法的返回類型。
  • 此功能將有助於避免在客戶端進行向下轉換。 它允許程序員在不需要類型檢查和向下轉換的情況下進行編程。
  • 協變返回類型始終僅適用於非原始返回類型。
interface Interviewer {
    default Object submitInterviewStatus() {
        System.out.println("Interviewer:Accept");
        return "Interviewer:Accept";
    }
}
class Manager implements Interviewer {
    @Override
    public String submitInterviewStatus() {
        System.out.println("Manager:Accept");
        return "Manager:Accept";
    }
}
class Project {
    public static void main(String args[]) {
        Interviewer interviewer = new Manager();
        interviewer.submitInterviewStatus();
        Manager mgr = new Manager();
        mgr.submitInterviewStatus();
    }
}

另一個例子來自Java,

一元運算符.java

@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {

    /**
     * Returns a unary operator that always returns its input argument.
     *
     * @param <T> the type of the input and output of the operator
     * @return a unary operator that always returns its input argument
     */
    static <T> UnaryOperator<T> identity() {
        return t -> t;
    }
}

函數.java

@FunctionalInterface
public interface Function<T, R> {

    ........
    ........
    ........
    ........

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

在 Java5 之前,無法通過更改返回類型來覆蓋任何方法。 但是現在,從 Java5 開始,如果子類覆蓋任何返回類型為非原始類型的方法,但它將其返回類型更改為子類類型,則可以通過更改返回類型來覆蓋方法。

暫無
暫無

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

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