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]

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top