假設我有一個名爲Robot的類。從Robot類中,我有一個名爲Racer的子類。稱爲Swimmer和Runner的兩個子類都擴展了Racer。在方法中投射參數 - Java
賽車手(及其所有的孩子)都有一種叫做sprint()的方法。
在另一個類中,我編寫了一個名爲race的靜態類方法,它接受一個Racer參數(或其任何子參數)。在比賽方法中,我使用了衝刺方法,這對賽車手及其孩子來說也是獨一無二的。
代碼運行成功,但如果我想通過sprint方法傳遞一個Robot參數會怎麼樣?什麼是允許我將機器人作爲賽車手的代碼?
我試圖做
public static void race((Racer) Robot arg) { //race method here }
,但沒有奏效。有任何想法嗎?
你會在'種族(...)'中做一個不是賽車手的機器人嗎? – Radiodef
'public static void race(Robot arg){((Racer)arg).sprint(); }'。如果你傳遞一個不是'Racer'的Robot,它會崩潰並且被'ClassCastException'燒燬,那麼爲什麼你要放棄編譯器類型檢查來防止這種情況發生? – Andreas
如果寫入方法採用'Racer',那麼它必須接收對該類型實例的引用。縮小參考轉換(「向下轉換」)是人們應該(幾乎)不會做的事情。您的演員a)可能無法工作,因爲'Robot'不一定是'Racer',並且b)應該在「a)」的情況下受到保護而不受'ClassCastException'的影響,或者更不理想的情況是捕捉並處理該異常。但是,最好的方法是不要沮喪。寫下這個方法,將實際計劃中實際上真正實際應用的參數類型傳遞給它。 –