2 回答

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
您沒有返回一個(gè)Test
對(duì)象,而是返回一個(gè)ITest
實(shí)例。
所有Test
對(duì)象都實(shí)現(xiàn)ITest
,但并非所有ITest
實(shí)例都必須是Test
對(duì)象。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
說得更徹底一點(diǎn):我的誤解是,我認(rèn)為對(duì)象的繼承是“較小的適合較大的”的問題,但這是錯(cuò)誤的思維方式。
對(duì)象是關(guān)于接口的。Lifeform
假設(shè)我們有一個(gè)可以的類grow()
,并且說我們有一個(gè)Dog
可以Lifeform
的類bark()
。以某種方式返回Lifeform
“適合” Dog
,但并非在所有情況下都滿足規(guī)范,Dog
因?yàn)椴⒎敲總€(gè)都Lifeform
可以bark()
。由于“變量的類型”的含義無(wú)非是“放心,所包含的對(duì)象實(shí)現(xiàn)了該類型指定的接口”,將“不是 a”放入Lifeform
類型Dog
變量Dog
中將違反這一保證。
因此,在這種情況下,如果方法返回Lifeform
by 簽名,則不能將其放入類型變量中Dog
,因?yàn)樗灰欢ㄊ?aable Dog
to bark()
。您可以向編譯器保證,返回的對(duì)象是Dog
通過強(qiáng)制轉(zhuǎn)換返回的,那么它就不會(huì)抱怨。換句話說,通過強(qiáng)制轉(zhuǎn)換,您可以告訴編譯器他可以“放心,返回的Lifeform
是一個(gè)Dog
可以bark()
”。
因此,在我的特殊情況下,我可以返回 aTest
因?yàn)樗鼘?shí)現(xiàn)了接口ITest
,并且每個(gè)人都可以確定,返回的對(duì)象將遵循 的規(guī)范ITest
,因此編譯器不會(huì)抱怨。但是,Test
除非編譯器確信該對(duì)象確實(shí)實(shí)現(xiàn)了Test
. 所以我們必須投射它,一切都是彩虹和獨(dú)角獸。
Test test = (Test) Tester.returnValueTest();
但我們應(yīng)該小心這一點(diǎn),因?yàn)樗葍H使用正確類型的變量更容易出錯(cuò)。
添加回答
舉報(bào)