Question

J'ai cette méthode:

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

La signature indique que la méthode revient Message, un objet que j'ai créé. Notez que dans certains cas, il revient AddressMessage, un autre objet de moi qui s'étend Message.

Mon problème - au cas où je reviendrai nouveau AddressMessage(arguments) Je ne peux pas le faire tomber plus tard pour être un AddressMessage Objet [Écriture (AddressMessage) object]

Était-ce utile?

La solution

Je suis d'accord, si ce que vous avez est un AddressMessage, alors il peut être toujours réduit en tant que tel.

Ce que j'attends, c'est plus une erreur logique. Que vous essayez réellement de réduire une instance d'une autre classe. Essayez simplement de déboguer cet endroit ou imprimer obj.getClass() Juste pour vérifier quelle classe vous essayez réellement de faire tomber.

Vous pouvez aussi utiliser if (my_message instanceof AddressMessage) ... ou quelque chose comme ça.

Autres conseils

if (object.instanceof (AddressMessage)) ... quelque chose comme ça? Regardez ici: Abattu en java

Vous devez vraiment utiliser des supports dans vos constructions IF-Else, sinon seule l'instruction suivante est utilisée comme clause "alors", ce qui peut être déroutant.

Voilà à quoi ressemble votre code avec les supports:

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;

Vous obtiendrez un fileMessage (snip2 = true) ou un BasicMessage (snip2 = false), rien d'autre.

Edit: un "else if (snip2)" au lieu de "if (snip2)" résoudra votre problème, mais vous devriez vraiment Utiliser des supports

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top