Почему я не могу использовать этот объект в Java? - PullRequest
0 голосов
/ 12 мая 2011

У меня есть этот метод:

    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 ]

2 голосов
/ 12 мая 2011

Я согласен, если у вас есть AddressMessage, то его всегда можно уменьшить как таковое.

То, что я ожидаю, является скорее логической ошибкой.То, что вы на самом деле пытаетесь опустить экземпляр другого класса.Просто попробуйте отладить это место или напечатайте obj.getClass() только для того, чтобы проверить, какой класс вы на самом деле пытаетесь понизить.

Вы также можете использовать if (my_message instanceof AddressMessage) ... или что-то вроде этого.

0 голосов
/ 12 мая 2011

Вы должны действительно использовать скобки в своих конструкциях 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)» решит вашу проблему, но вы должны действительно использовать скобки

0 голосов
/ 12 мая 2011

if (object.instanceOf (AddressMessage)) ... что-то вроде этого?смотрите здесь: Даункастинг в Java

...