2012-01-06 122 views
12

我知道投射只能從子類到超類(上投)完成,但此示例說明了我想要執行的操作。將超類的對象投射到子類 - 向下投射

Class Super {} 
Class Sub extends Super {} 

Super super = new Super(); 
Sub sub = (Sub)super; 

我相信這是因爲這是不允許的那麼「向下」鑄...

什麼是創建給定類型超級的對象類型分的目標的最佳方式提及。

編輯:

這是問題 - 什麼是對動物轉化成貓的最佳途徑。

答案?從一個基本類型的動物開始,並將屬性複製到貓。添加毛皮和尾巴等。基本上是一個拷貝構造函數。這是正確的答案(還是很好的答案)?

ANOTHER編輯:

我想我的問題是很清楚的,但也許是過於籠統。要求採取「最佳」方式做某些事情往往會給出很多不同的答案。我意識到在不同情況下最好的方式可能會有所不同。

我不是在尋找關於Java或OO基礎知識的教程。只是在徵求意見,以便我可以解決這個問題,因爲我已經用最佳實踐概述了它。

+0

從你的問題來看,你不清楚你知道什麼,你不知道什麼。所以,當人們回答*時,不要感到驚訝,我相信這被稱爲「下來」投射,這是不允許的*部分而不是(非常模糊的)「實際問題。」是的,複製構造函數就是這樣。不,它不是唯一的,工廠方法會很好。不,這不是最好的 - 我們不知道你有什麼限制和假設。 – alf 2012-01-06 13:36:26

+0

@alf我可以告訴你我的問題很清楚 - 你能否就如何在一般情況下提出問題提供更多建議?我希望能夠問一個問題,增加網站的價值,並獲得有價值的迴應,但在這種情況下,似乎我有一種失敗......誤解,低調,我最終有點沮喪。 – Matthew 2012-01-06 13:44:49

+1

好吧,我可以看到選票的細分,並且沒有票下來。沒有投票,但那不是重點,是嗎?標準的HOWTO應該是http://catb.org/~esr/faqs/smart-questions.html - 這很好,關鍵點。在目前的問題上,我會說責怪那些試圖幫助的人不是一個很有創意的想法;說明你的問題很清楚,當你需要兩次編輯是非常接近的責備,只有少數人會注意到這種差異。在這裏添加「感謝您實際閱讀我的問題」,您將獲得公平的侵略性。善待。修復錯誤。不要責怪 – alf 2012-01-06 13:52:08

回答

9

A CatAnimal

如果我給你一隻動物(不一定是貓),你會如何將它轉換成一隻貓?

編輯:

有一種方法可以做任何事情。大多數時候,你不應該。我相信一個更好的設計可以消除向下轉換的需要。但你可以:

  • Super一個構造函數一個Sub作爲參數。

  • 實現了Super的工廠,並且具有以Sub作爲參數的方法。

我建議你擴大你的問題,告訴我們你需要什麼,因爲我真的認爲一個更優雅的解決方案存在。

+2

@Matthew - 僅僅因爲有辦法做到這一點,並不意味着你應該這樣做。靜態你想達到的效果會更好。向下轉換很少是答案,我肯定有一個更好的解決方案存在於你的案例中。 – 2012-01-06 13:17:19

+0

感謝您的回答。我可能只是做一些研究,並確切地找出在這種情況下我可能需要的東西,並提出更詳細和具體的問題。這肯定會做我現在需要的,因爲我只是要求一個普遍的答案,但我知道我會遇到一種情況,我需要稍後更具體的東西。 – Matthew 2012-01-06 14:30:25

1

編輯:從你的問題來看,它並不完全清楚你知道什麼,你不知道什麼。所以,當人們回答

我相信這是因爲這是不允許的

一部分,而不是(很模糊)「下」鑄造簡稱不要感到驚訝,「實際問題」。

是的,複製構造函數就是這樣。

不,它不是唯一的,工廠方法會做得很好。

不,這不是最好的 - 我們不知道你有什麼限制和假設。


舊版本: 鑄件可以做到無論哪種方式,與向上轉型是通常是不必要的(除非你需要選擇一個特定的重載方法)。

通常沒有辦法創建一個類型爲Sub的對象,只要創建一個基於來自給定數據的新對象的方法,就可以創建一個Super類型的對象。

爲了投射,您必須確保您投射的對象實際上是您投射到的類型(或其子類型)。

+0

我明確指出,我知道上鑄是允許的,我知道下鑄沒有。通過詢問給出這些信息的x的最佳方式,我完成了它。我現在有點修辭 - 我怎麼不清楚? – Matthew 2012-01-06 13:56:46

+1

@Matthew,向下*是*允許的。目前還不清楚你是否知道「downcasting」是什麼,因爲它確實被允許,所以它可能是通常的「vs vs哪個」問題或缺乏理解。根據以往的經驗,許多人認爲缺乏瞭解。 – alf 2012-01-06 14:02:16

+0

我想我可以說:「我知道在這種特殊情況下不允許鑄造」......「。 – Matthew 2012-01-06 14:17:37

5

如果實際對象是「Sub」類型,則只能向下傾倒。 例如:

Super subAsSuper = new Sub(); 
Sub sub = (Sub)subAsSuper 

你的方式是行不通的,因爲超未分的子類。所以你會得到一個運行時錯誤。

5

您可以將一個構造函數添加到Sub類中,該類將Super對象作爲參數。

0

把這個想法記 -

Class Super {} 
Class Sub { 
    public Super super = new Super(); 
} 

Sub sub = new Sub(); 
sub.super = super; 

我做了一個非常簡單的例子在這裏,但你可以去任何你想要這個,你可以把它的工作相同像繼承。不管怎樣,它都不會返回任何錯誤。