我有这个方法:
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
]
答案 0 :(得分:2)
我同意,如果您拥有的是AddressMessage,那么它可以随时被降级。
我的期望更多是逻辑错误。你实际上试图向下转换另一个类的实例。只是尝试调试那个地方或打印obj.getClass()
只是为了验证你实际上试图向下倾斜的课程。
您也可以使用if (my_message instanceof AddressMessage) ...
或类似的内容。
答案 1 :(得分:0)
if(object.instanceOf(AddressMessage))......这样的事情? 看这里:Downcasting in Java
答案 2 :(得分: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),没有别的。
编辑:“否则if(SNIP2)”而非“if(SNIP2)”将解决您的问题,但您应该真的使用括号