-2

我有这个方法:

    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;
}

签名声明方法 return Message,这是我创建的一个对象。请注意,在某些情况下,它会返回AddressMessage我的另一个扩展对象Message

我的问题 - 万一我返回新的AddressMessage(arguments),我以后不能把它变成一个AddressMessage对象[写作(AddressMessage) object]

4

3 回答 3

2

我同意,如果您拥有的是 AddressMessage,那么它总是可以这样被贬低。

我期望的是更多的逻辑错误。你实际上试图向下转换另一个类的实例。只需尝试调试该位置或打印obj.getClass()以验证您实际尝试向下转换的类。

您也可以使用if (my_message instanceof AddressMessage) ...或类似的东西。

于 2011-05-12T11:51:17.583 回答
0

if (object.instanceOf(AddressMessage))... 是这样的吗?看这里:Java 中的向下转型

于 2011-05-12T11:50:09.437 回答
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),仅此而已。

编辑:一个“else if (SNIP2)”而不是“if (SNIP2)”将解决你的问题,但你真的应该使用括号

于 2011-05-12T12:18:56.947 回答