Pourquoi ne puis-je pas réduire cet objet en Java?
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
]
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