Perché non posso abbattere questo oggetto in Java?
Domanda
Ho questo metodo:
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 firma afferma che il metodo restituisce Message
, un oggetto che ho creato.Si noti che in alcuni casi restituisce AddressMessage
, un altro oggetto del mio che estende Message
.
Il mio problema - Nel caso in cui restituisco il nuovo AddressMessage(arguments)
che non riesco a downcast in seguito
essere un oggetto AddressMessage
[scrivendo (AddressMessage) object
]
Soluzione
Sono d'accordo, se ciò che hai è un incontro, quindi può essere sempre dimensionato come tale.
Cosa mi aspetto è più un errore logico.Che cerchi effettivamente di abbattere un'istanza di un'altra classe.Basta provare a eseguire il debug del posto o stampare obj.getClass()
solo per verificare quale classe stai effettivamente cercando di abbattere.
Puoi anche utilizzare if (my_message instanceof AddressMessage) ...
o qualcosa del genere.
Altri suggerimenti
IF (Object.instance of (AddressMessage)) ... qualcosa del genere? Guarda qui: Downcasting in Java
Dovresti davvero usare parentesi nei costrutti if-else, altrimenti solo la prossima dichiarazione viene utilizzata come clausola "quindi", che può essere confusa.
Questo è ciò che sembra il tuo codice con le parentesi:
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;
.
Otterrai un fileMessage (snip2= true) o un basessage (snip2= falso), nient'altro.
Modifica: un "altro se (snip2)" invece di "If (snip2)" risolverà il tuo problema, ma dovresti Direttamente Usa Staffe