2011-05-12 130 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)”,将解决你的问题,但你应该真的使用括号

相关问题