本文介紹了Java方法覆蓋協方差查詢的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個關于覆蓋協方差的方法的查詢。
假設我們有兩個類,如下所示:
class Parent {
Object getSomething(){
return 10;
}
}
class Child extends Parent {
Integer getSomething() {
return 10;
}
}
class TestCovariance {
public static void main(String[] args) {
Child c = new Child();
Parent p = new Child();
Integer i1 = c.getSomething(); //this is ok
Integer i2 = p.getSomething(); //this one gives a runtime exception
}
}
正如您在提供運行時異常的該行的注釋中看到的,異常詳細信息:
線程”main”java.lang.RuntimeException中出現異常:無法編譯
源代碼不兼容的類型:無法轉換java.lang.Object
至java.lang.Integer
為什么它看到c
對象的方法返回Integer
,而p
對象的方法返回Object
??
推薦答案
首先,我要重申協變返回類型是將重寫方法的返回類型更改為重寫方法返回類型的子類型的能力,在您的情況下這似乎是正確的。
對Integer i1 = c.getSomething();
的調用編譯成功,因為接收方類型為Child
,并且編譯器知道c.getSomething()
的返回類型為Integer
。
但是,另一方面,由于您使用Parent
作為p
的接收器類型,因此只有Parent
類的方法通過此引用可見,即使實際對象p
引用的是Child
,并且顯然假定p.getSomething()
在編譯時返回Object
,并且您正在嘗試將其賦給<[
話雖如此,電話Integer i2 = p.getSomething();
能否在運行時成功,但如前所述,這是編譯時錯誤,因為編譯器會檢查并確保您只調用接收方類型存在的方法。
也如davidxxx所述:
引發了RuntimeException,但它不是由程序引發的
而不是IDE,因為它”發現”啟動的程序有一個
無法編譯的類。
這篇關于Java方法覆蓋協方差查詢的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,