2011-05-12 126 views
-2

我有這樣的方法:爲什麼我不能在Java中下載這個對象?

private Message getMessage(DataInputStream in) throws IOException { 
    CommandEnum caption = CommandEnum.valueOf(in.readUTF()); 
    BasicMessage inputMessage; 
    if (caption.equals(CommandEnum.BEGIN) || caption.equals(CommandEnum.FILEADDRESS) 
      || caption.equals(CommandEnum.CONTAINNAMESERVER)) 
     inputMessage = new AddressMessage(caption,in.readUTF(),in.readInt()); 
    if (caption.equals(CommandEnum.CONTAINFILE) || caption.equals(CommandEnum.DONTCONTAINFILE) 
      || caption.equals(CommandEnum.WANTFILE)) 
     inputMessage = new FileMessage(caption,in.readUTF()); 
    else 
     inputMessage = new BasicMessage(caption); 
    in.readUTF(); 
    return inputMessage; 
} 

簽名指出,該方法返回Message,我創建了一個對象。請注意,在某些情況下,它會返回AddressMessage,這是我的另一個對象,它延伸到Message

我的問題 - 如果我回到新AddressMessage(arguments)我不能垂頭喪氣它後來 是一個AddressMessage對象[寫作(AddressMessage) object]

+4

你是什麼意思與「我不能垂頭喪氣它後來」?爲什麼不?當你嘗試時會發生什麼? – 2011-05-12 11:46:52

+1

這裏有什麼問題? – 2011-05-12 11:46:57

回答

2

我同意,如果你有什麼是一個AddressMessage,那麼它總是可以被降級。

我期望的是更多的邏輯錯誤。你實際上試圖貶低另一個類的實例。只要嘗試調試那個地方或打印obj.getClass()只是爲了驗證你實際上試圖貶低什麼課程。

你也可以使用​​或類似的東西。

0

如果(object.instanceOf(AddressMessage))......這樣的事情? 看這裏:Downcasting in Java

0

你應該在你的if-else結構中真的使用括號,否則只有下一個語句被用作「then」子句,這會造成混淆。

這是你的代碼是什麼樣子用括號:

BasicMessage inputMessage; 
if (SNIP1) { 
    inputMessage = new AddressMessage(caption,in.readUTF(),in.readInt()); 
} 
if (SNIP2) { 
    inputMessage = new FileMessage(caption,in.readUTF()); 
} else { 
    inputMessage = new BasicMessage(caption); 
} 
in.readUTF(); 
return inputMessage; 

你會要麼得到一個FileMessage(SNIP2 = TRUE)或BasicMessage(SNIP2 = FALSE),沒有別的。

編輯:一個「否則,如果(SNIP2)」而不是「如果(SNIP2)」,將解決你的問題,但你應該真的使用括號

相關問題