我创建了一个NotificationManager类,让你可以为一些通用的通知服务注册一个通用的监听器。在NotificationManager类中,我有一个通用的方法来注册一个带有服务的监听器:
public static <E> void registerNotify(Class<E> type, INotificationListener<E> listener) {
@SuppressWarnings("unchecked")
INotificationService<E> service = (INotificationService<E>) NotificationServiceFactory.get(type);
service.registerNotificationListener(listener);
}
因此,对于某个特定类型的INotificationListener,我想强制用户在调用此方法时指定与侦听器相同的类型。该类型映射到相同类型的所有INotificationListener,但是此方法不强制执行我要强制执行的操作。例如,我可以打电话:
INotificationListener<Location> locationListener = this;
NotificationManager.registerNotify(String.class, locationListener);
并且代码编译得很好。我认为这将强制实施如下:
INotificationListener<Location> locationListener = this;
NotificationManager.registerNotify(Location.class, locationListener);
关于如何实现这一目标的任何想法?
更新
对不起混淆,上面确实有效。同一类中不起作用的方法实际上如下:
public static <E> void broadcastNotify(Class<E> type, E data)
{
@SuppressWarnings("unchecked")
INotificationService<E> service = (INotificationService<E>) NotificationServiceFactory.get(type);
service.notifyListeners(data);
}
并致电:
Location location = new Location();
NotificationManager.broadcastNotify(Object.class, location);
不会导致编译错误,这是我希望它做的。
答案 0 :(得分:1)
我想出来了。我改变了签名:
public static <E> void broadcastNotify(Class<E> type, E data)
为:
public static <E> void broadcastNotify(Class<E> type, INotification<E> data)
其中INotification是一个包装我试图在通知中返回的数据的接口。这强制类类型必须与通知类型完全匹配,以便映射通知的基础映射将消息正确发送到已注册的侦听器,而不必担心程序员错误。
答案 1 :(得分:0)
避免此问题的一种方法是使用反射并从类本身获取类型。这将避免两次提供相同类型的需要。它只会提供一个警告,使用非泛型类型。
您可以从实现类的接口获取泛型类型。
答案 2 :(得分:0)
位置是一个对象 - 我相信它变成了:
public static <Object> void broadcastNotify(Class<Object> type, Object data)
请记住,在java中,所有对象都从Object继承。