我創建了一個NotificationManager類,讓我們向通用通知服務註冊一個通用偵聽器。在NotificationManager類我有一個與服務註冊監聽器的一般方法:Java:如何強制類類型參數與通用方法中指定的泛型類型相同?
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);
不會導致編譯錯誤,這就是我想它做的事。
什麼是'NotificationServiceFactory#get()'的聲明返回類型? – 2011-06-01 20:19:41
這是INotificationService >。工廠擁有一個映射,它將類類型名稱映射到INotificationServices。我想它應該是INotificationService,但是如何確保用戶在通過registerNotify方法中的錯誤類時遇到編譯錯誤? –
2011-06-01 20:24:05
我不確定,但當我嘗試傳遞'String.class'(Eclipse Helios SR2)時,我只是得到了所需的編譯錯誤。你真的在運行你認爲你正在運行的代碼嗎?或者你使用的是javac還是不同的IDE? – BalusC 2011-06-01 20:37:48