2015-11-04 61 views
0

我有一些類PERSONINFO和其他類鑄一類到另一個,從什麼擴展我的

public class LotusUser extends PERSONINFO { 

} 

在我的代碼具有可變personPERSONINFO類型,我想將它轉換爲LotusUser

LotusUser lu = (LotusUser) person; 

但它的失敗,除了 java.lang.ClassCastException lotus.PERSONINFO不能轉換爲users.LotusUser。

如何解決這個問題?

謝謝。

+0

我希望你_don't_有'塊class'命名帽。 –

回答

3

因爲LotusUserPERSONINFO一個子類,所有LotusUser實例也是PERSONINFO實例,但所有PERSONINFO實例都LotusUser實例。 (就像所有的貓都是動物,但不是所有的動物都是貓。)它們可能只是PERSONINFO,或者它們可能是GlarbleThorp(我剛剛創建的另一個子類PERSONINFO)。因此,在一般情況下,除非您知道PERSONINFO實際上是LotusUser(或LotusUser子類),否則不能將對該實例的引用強制轉換爲LotusUser,因爲它可能不是一個。

你只嘗試投放PERSONINFO引用LotusUser引用的對象,你知道實際上LotusUser撮合它(你可以用instanceof檢查,但如果知識來自於代碼的邏輯是更好),或理想情況下,通過編寫代碼,以便根本不需要進行演員製作。當你用盡其他選項時,投射是最後的選擇。 (遺憾的是,儘管這是最後一招,但最終確實會頻繁出現,不過現代Java與泛型等比起以前的版本更好一些。)

1

你不能那樣做。您必須明白,即使LotusUser的每個實例都是PERSONINFO的實例,但並非每個PERSONINFO實例都自動成爲LotusUser的實例。

所以,你需要檢查它是否是,你施放前:

if (person instanceof LotusUser){ 
    LotusUser user = (LotusUser)person; 
    // rest of your code 
} 
else{ 
throw new IllegalArgumentException("Invalid type"); 
} 
0

問題是LotusUserPERSONINFO,但它不工作,反過來,也就是,PERSONINFO可能不是LotusUser

對於失敗演員,這意味着無論您提供的PERSONINFO對象是什麼,它實際上都不是LotusUser。它可能是一個PERSONINFO類或其他擴展它的類。

您可以使用instanceof運營商,看是否personLotusUser類的實例,但也有其缺陷:

if(person instanceof LotusUser) { 
    LotusUser lu = (LotusUser)person; 
} 
else { 
    //Todo when casing fails. 
} 
相關問題