为什么我不能在Java中转发这个对象?

时间:2011-05-12 11:43:58

标签: java oop casting downcast

我有这个方法:

    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]

3 个答案:

答案 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)”将解决您的问题,但您应该真的使用括号