簡體   English   中英

反射:將對象轉換為子類而不使用instanceof

[英]Reflection: cast an object to subclass without use instanceof

我有這個簡單的接口/類:

public abstract class Message {}

public class Message1 extends Message {}

public class Message2 extends Message {}

一個實用類:

public class Utility {
    public void handler(Message m) {
        System.out.println("Interface: Message");
    }

    public void handler(Message1 m) {
        System.out.println("Class: Message1");
    }

    public void handler(Message2 m) {
        System.out.println("Class: Message2");
    }
}

現在,主要類:

public static void main(String[] args) {

    Utility p = new Utility();

    Message1 m1 = new Message1();
    p.handler(m1);

    Message m = (Message) m1;
    p.handler(m);

}

輸出是

> Class: Message1
> Interface: Message

我希望p.handler(m)調用方法p.handler(m:Message1)

我不想使用“手動”命令instanceof因為我有很多情況:

if(m instance of Message1)
p.handler((Message1)m)
else if (m instanceof Message2)
p.handler((Message2)m)
...

如果我調用m.getClass()我獲得“mypackage.Message1”,所以子類而不是超類。

我嘗試使用此代碼(使用反射):

p.handler(m.getClass().cast(m));

但輸出是

> Interface: Message

所以,這是我的問題。 我會做一個超類對象的運行時強制轉換為subclassobject而不使用“code command”istanceof。

我會這樣一個正確的命令:

p.handler((m.getclass)m);

我怎樣才能獲得它? 這是可能的?

Java將根據編譯時已知的信息調用該方法。 您可以做的是向接口添加一個方法,該方法為對象調用正確的處理程序方法。

public abstract class Message {

    public abstract void callHandler(Utility utility);

}

public class Message1 extends Message{

    public void callHandler(Utility utility) {
        utility.handler(this);
    }
}

您對處理程序的調用變為:

Message m=(Message) m1;
m.callHandler(p);

現在調用Utility :: handler(Message1),即使main中的引用是Message接口的類型。

我不確定你的handle(..)方法應該做什么,但由於它們依賴於Message的特定實例,你應該考慮在你的Message類中添加handle()方法(作為抽象方法)。 這樣,每條消息都實現了它的句柄版本,你可以享受多態的好處:

Message m = new Message1();
m.handle();

此代碼將根據需要返回“Class:Message1”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM