Java:如何强制类类型参数与泛型方法中指定的泛型类型相同?

Java:如何强制类类型参数与泛型方法中指定的泛型类型相同?,java,generics,Java,Generics,我创建了一个NotificationManager类,让您向某个通用通知服务注册一个通用侦听器。在NotificationManager类中,我有一个用于向服务注册侦听器的通用方法: public static <E> void registerNotify(Class<E> type, INotificationListener<E> listener) { @SuppressWarnings("unchecked") INotificati

我创建了一个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);
}

不会导致编译错误,这正是我希望它做的。

避免问题的一种方法是使用反射并从类本身获取类型。这将避免需要提供两次相同的类型。当使用非泛型类型时,它将仅提供警告


您可以从实现类的接口获取泛型类型。

位置是一个对象-我相信它会变成:

public static <Object> void broadcastNotify(Class<Object> type, Object data) 
publicstaticvoidbroadcastNotify(类类型、对象数据)

请记住,在java中,所有对象都继承自对象。

我发现了这一点。我更改了以下签名:

public static <E> void broadcastNotify(Class<E> type, E data)
公共静态无效广播通知(类类型,E数据)
致:

publicstaticvoidbroadcastNotify(类类型,INotification数据)

其中INotification是一个接口,它封装了我试图在通知中返回的数据。这强制要求类类型必须与通知类型完全匹配,以便映射通知的基础映射将消息正确发送到注册的侦听器,而无需担心程序员错误。

NotificationServiceFactory#get()的声明返回类型是什么?它是INotificationService。工厂拥有一个映射,它将类类型名称映射到INotificationServices。我想应该是INotificationService,但是当用户在registerNotify方法中传递错误的类时,如何确保用户得到编译错误?我不确定,但我只是在尝试传递
String.class
(Eclipse Helios SR2)时得到了所需的编译错误。你真的在运行你认为正在运行的代码吗?或者您使用的是javac还是其他IDE?在IDE内外(NetBeans 6.9.1)执行此操作时,我也会遇到一个编译器错误@你们真的是在用不太具体的方式打电话吗?对不起,伙计们,周末太长了。我用正确的方法编辑了我的问题。我所列出的一个确实如预期的那样工作。我选择不走这条路线是因为可读性。如果一个类使用“this”作为侦听器参数注册和注销一组不同类型的侦听器,则很难判断它注册/注销通知的目的是什么。它注册/注销它接受的通知类型。您只需查看实现。但我同意,最好做您认为最清楚、最不可能导致错误的事情。我知道,但我希望将其强制为完全相同的类,因为在我下面有一个映射,它将类映射到该类的侦听器,因此如果有人向registerNotify(Location.class,this)注册,但是广播被写为broadcastNotify(Object.class,location),侦听器将不会收到消息。
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);
public static <Object> void broadcastNotify(Class<Object> type, Object data) 
public static <E> void broadcastNotify(Class<E> type, E data)
public static <E> void broadcastNotify(Class<E> type, INotification<E> data)