本文介紹了Java方法覆蓋協(xié)方差查詢的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我有一個(gè)關(guān)于覆蓋協(xié)方差的方法的查詢。
假設(shè)我們有兩個(gè)類,如下所示:
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
}
}
正如您在提供運(yùn)行時(shí)異常的該行的注釋中看到的,異常詳細(xì)信息:
線程”main”java.lang.RuntimeException中出現(xiàn)異常:無(wú)法編譯
源代碼不兼容的類型:無(wú)法轉(zhuǎn)換java.lang.Object
至java.lang.Integer
為什么它看到c
對(duì)象的方法返回Integer
,而p
對(duì)象的方法返回Object
??
推薦答案
首先,我要重申協(xié)變返回類型是將重寫方法的返回類型更改為重寫方法返回類型的子類型的能力,在您的情況下這似乎是正確的。
對(duì)Integer i1 = c.getSomething();
的調(diào)用編譯成功,因?yàn)榻邮辗筋愋蜑?code>Child,并且編譯器知道c.getSomething()
的返回類型為Integer
。
但是,另一方面,由于您使用Parent
作為p
的接收器類型,因此只有Parent
類的方法通過(guò)此引用可見,即使實(shí)際對(duì)象p
引用的是Child
,并且顯然假定p.getSomething()
在編譯時(shí)返回Object
,并且您正在嘗試將其賦給<[
話雖如此,電話Integer i2 = p.getSomething();
能否在運(yùn)行時(shí)成功,但如前所述,這是編譯時(shí)錯(cuò)誤,因?yàn)榫幾g器會(huì)檢查并確保您只調(diào)用接收方類型存在的方法。
也如davidxxx所述:
引發(fā)了RuntimeException,但它不是由程序引發(fā)的
而不是IDE,因?yàn)樗?#8221;發(fā)現(xiàn)”啟動(dòng)的程序有一個(gè)
無(wú)法編譯的類。
這篇關(guān)于Java方法覆蓋協(xié)方差查詢的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,