2017-05-27 83 views
0

假設我有一個名爲Robot的類。從Robot類中,我有一個名爲Racer的子類。稱爲Swimmer和Runner的兩個子類都擴展了Racer。在方法中投射參數 - Java

賽車手(及其所有的孩子)都有一種叫做sprint()的方法。

在另一個類中,我編寫了一個名爲race的靜態類方法,它接受一個Racer參數(或其任何子參數)。在比賽方法中,我使用了衝刺方法,這對賽車手及其孩子來說也是獨一無二的。

代碼運行成功,但如果我想通過sprint方法傳遞一個Robot參數會怎麼樣?什麼是允許我將機器人作爲賽車手的代碼?

我試圖做

public static void race((Racer) Robot arg) { //race method here }

,但沒有奏效。有任何想法嗎?

+5

你會在'種族(...)'中做一個不是賽車手的機器人嗎? – Radiodef

+2

'public static void race(Robot arg){((Racer)arg).sprint(); }'。如果你傳遞一個不是'Racer'的Robot,它會崩潰並且被'ClassCastException'燒燬,那麼爲什麼你要放棄編譯器類型檢查來防止這種情況發生? – Andreas

+0

如果寫入方法採用'Racer',那麼它必須接收對該類型實例的引用。縮小參考轉換(「向下轉換」)是人們應該(幾乎)不會做的事情。您的演員a)可能無法工作,因爲'Robot'不一定是'Racer',並且b)應該在「a)」的情況下受到保護而不受'ClassCastException'的影響,或者更不理想的情況是捕捉並處理該異常。但是,最好的方法是不要沮喪。寫下這個方法,將實際計劃中實際上真正實際應用的參數類型傳遞給它。 –

回答

0

方法參數不能類型轉換。你可以給超類作爲參數,這樣內部方法可以基於運行時對象進行類型轉換。

+0

那是什麼語法? –

+0

您可以創建Robot類作爲接口並給出抽象方法。創建一個實現Robot類的類,然後重寫抽象方法。 公共接口機器人{0} {0} {0} {0} } 公共類賽車實現機器人{ \t公共無效衝刺(){ \t \t的System.out.println( 「ABC」); \t}} 公共類的測試{ \t公共靜態無效的比賽(機器人ARG){ \t \t arg.sprint(); \t} } –