天天看點

教妹學Java(三十二):了解 Java 中的傳回類型協變

三妹開學了,學的計算機軟體程式設計。她學校離我家很近,坐公共汽車也就 10 站路的距離, 每逢周末她都會來找我,讓我輔導她學習 Java。作為一名擁有十餘年程式設計經驗的程式員,再加上父母給我們的這份血緣關系,我覺得義不容辭。

“二哥,今天我們要學習的内容是‘傳回類型協變(covariant return type)’,對吧?”看來三妹已經提前預習了我上次留給她的作業。

“是的,三妹。Java 1.5 之前,無法通過更改方法的傳回類型來重寫任何方法。 ”我面帶着樸實無華的微笑回答着她,“但是從 Java 1.5 之後,如果方法的傳回類型不是基本資料類型,子類就可以通過更改傳回類型來達到方法重寫的目的。”

----正兒八經的分割線,正文開始------------

來看下面這個例子。

/**
 * @author 微信搜「沉默王二」,回複關鍵字 PDF
 */
class A{
    A get(){return this;}
}
public class B extends A{
    @Override
    B get() {
        return this;
    }
   
    void out() {
        System.out.println("傳回類型協變");
    }
    public static void main(String[] args) {
        new B().get().out();
    }
}      

程式輸出結果如下所示:

傳回類型協變

通過上面的例子可以看得到,A 類的 get() 傳回類型是 A,B 類的 get() 方法傳回類型是 B,B 類繼承了 B 類,也就是說 get() 方法通過傳回類型協變達到了方法重寫的目的。

在學習方法重載(overloading)的時候,我們知道,不能通過更改方法的傳回類型來完成方法重載,但 Java 卻允許通過更改方法的傳回類型來完成方法重寫(overriding)。

“三妹,關于 Java 中的傳回類型協變,我們暫且先學到這裡吧。”我揉一揉犯困的雙眼,疲憊地給三妹說。

“好的,二哥,我這就去練習去。”三妹似乎意猶未盡,這種學習狀态真令我感到開心。