Creé una clase de NotificationManager, que permite registrar un oyente genérico en un servicio de notificación genérico. En la clase NotificationManager Tengo un método genérico para registrar un oyente con un servicio:Java: ¿Cómo se exige que un parámetro de tipo de clase sea el mismo que el genérico especificado en un método genérico?
public static <E> void registerNotify(Class<E> type, INotificationListener<E> listener) {
@SuppressWarnings("unchecked")
INotificationService<E> service = (INotificationService<E>) NotificationServiceFactory.get(type);
service.registerNotificationListener(listener);
}
Así, para algunos INotificationListener de un tipo particular me gustaría obligar al usuario, cuando se llama a este método, para especificar el mismo tipo que el oyente. El tipo se asigna a todos los INotificationListeners del mismo tipo, sin embargo, este método no impone lo que estoy tratando de hacer cumplir. Por ejemplo, podría llamar:
INotificationListener<Location> locationListener = this;
NotificationManager.registerNotify(String.class, locationListener);
y el código compila bien. Lo que pensé que esto haría cumplir es el siguiente:
INotificationListener<Location> locationListener = this;
NotificationManager.registerNotify(Location.class, locationListener);
¿Alguna idea sobre cómo lograr esto?
Actualización:
Lo siento por la confusión, lo anterior de hecho funciona. El método en la misma clase que no funciona en realidad es la siguiente:
public static <E> void broadcastNotify(Class<E> type, E data)
{
@SuppressWarnings("unchecked")
INotificationService<E> service = (INotificationService<E>) NotificationServiceFactory.get(type);
service.notifyListeners(data);
}
Y llamando a:
Location location = new Location();
NotificationManager.broadcastNotify(Object.class, location);
no causa un error de compilación, que es lo que me gustaría que hiciera.
¿Cuál es el tipo de devolución declarada de 'NotificationServiceFactory # get()'? –
Es INotificationService >. La fábrica tiene un mapa que asigna nombres de clase a INotificationServices. Supongo que probablemente debería ser INotificationService, pero ¿cómo me aseguro de que el usuario obtenga un error de compilación cuando pasan la clase incorrecta en el método registerNotify? –
No estoy seguro, pero acabo de obtener el error de compilación deseado cuando intento pasar 'String.class' (Eclipse Helios SR2). ¿Realmente está ejecutando el código que cree que está ejecutando? ¿O estás usando javac o un IDE diferente? – BalusC