对泛型的了解不多,最近了一个类继承方面的包装,更进一步了解泛型能如何使用。
需求如下:
- 有一个工厂类,通过工厂类去生产一个 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);
}
}
}