1. 程式人生 > >Java 泛型在類繼承方面的使用

Java 泛型在類繼承方面的使用

對泛型的瞭解不多,最近了一個類繼承方面的包裝,更進一步瞭解泛型能如何使用。

需求如下:

  • 有一個工廠類,通過工廠類去生產一個 Consumer。
  • Consumer 需要呼叫 setMessageListener 方法去設定一個 IMessageListener。
  • 這個 IMessageListener 有一個方法onMessage(Object message)

現在需要,使用者在使用onMessage方法時,可以指定message物件的型別,而不用自己在onMessage方法裡強轉一下。例如:

舊:onMessage(Object message)
新1:onMessage(String
strMsg) 新2:onMessage(MyObject myObj) 新3:。。。

最簡單的方法,把 IMessageListener 修改成如下形式:

public interface IMessageListener<T> {
    void onMessage(T msg);
}

呼叫方

consumer.setMessageListener(new IMessageListener<IBusMessage>() {
            @Override
            public void onMessage(MyMessageType msg) {
            // do sth
} }

包裝方(對setMessageListener的包裝)

public void setMessageListener(IMessageListener listener) throws MessageBusException {
    // 注意1,宣告介面時,不用指定 <T>
    dmlc.setMessageListener(new MessageListener() {
        @Override
        public void onMessage(Message rawMsg) {

            Object objMsg = msgConverter.fromMessage(rawMsg);
            // 注意2,這裡直接把 objMsg 傳給 onMessage 方法就可以了,不用轉成 T 型別,Java自己幫我們轉了。
// 原來以為,這是需要手動轉成 T 所在的 class 或 其它型別 listener.onMessage(objMsg); } } }