-2

私はこの方法を持っています:

    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]

4

3 に答える 3

2

あなたが持っているのがAddressMessageである場合、それは常にそのようにダウンキャストできることに同意します。

私が期待しているのは、もっと論理的な間違いです。実際に別のクラスのインスタンスをダウンキャストしようとすること。obj.getClass()実際にダウンキャストしようとしているクラスを確認するために、その場所をデバッグするか、印刷してみてください。

またはこのようなものを使用することもできますif (my_message instanceof AddressMessage) ...

于 2011-05-12T11:51:17.583 に答える
0

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) のいずれかを取得しますが、他には何もありません。

編集:「if(SNIP2)」の代わりに「else if(SNIP2)」を使用すると問題が解決しますが、実際には括弧を使用する必要があります

于 2011-05-12T12:18:56.947 に答える
0

if (object.instanceOf(AddressMessage))... こんな感じ?こちらをご覧ください: Java でのダウンキャスト

于 2011-05-12T11:50:09.437 に答える