Java 泛型在類繼承方面的使用
阿新 • • 發佈:2018-12-26
對泛型的瞭解不多,最近了一個類繼承方面的包裝,更進一步瞭解泛型能如何使用。
需求如下:
- 有一個工廠類,通過工廠類去生產一個 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);
}
}
}