![](/img/trans.png)
[英]Understanding Java Generics <T extends Class> and <? extends Class>
[英]Java: Pass actual <T extends Event> class. (Generics Problems)
我已經制作了自己的EventExecutor
類,其類型為<T extends Event>
EventExecutor
<T extends Event>
。
public interface EventExecutor<T extends Event> {
...
public abstract void execute(Event event);
}
我現在知道這里的位置是錯誤的,因為我想傳遞:
public abstract void execute(T event);
我一直在使用Event Management System
,並且在運行所有其他事件后未取消某個Event
時,某些代碼將從EventExecutor
運行,如下所示:
// event parameter should be of type T.
EventManager.call(event -> {
// code here.
}, Class<? extends Event>, Object... eventParameters);
這里的問題是因為EventExecutor
方法execute
具有參數Event
,這意味着EventExecutor
event ->
是Event
類型,而不是extends Event
的通緝類,因此這意味着我必須進行一些強制轉換,這不是我要做的想做。
使我無法使用T
的泛型類型的問題是我的EventManager
類的方法call
:
public static void call(EventExecutor<? extends Event> eventExecutor, Class<? extends Event> eventClass, Object... eventArgs) {
synchronized (LOCK) {
if (!checkIsEventClassRegistered(eventClass)) return;
try {
Event event = null;
Class<?>[] constructorParameters = EventUtilities.getArrayOfClasses(eventArgs);
Constructor<?> constructor = eventClass.getDeclaredConstructor(constructorParameters);
event = (Event) constructor.newInstance(eventArgs);
// HERE:
if (!callAllRegisteredMethods(event)) eventExecutor.execute(event);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我承認,我是泛型新手,但我看不到一切都出了什么問題。 我嘗試將event
(在eventExecutor.execute(...)
方法中)強制轉換為T
,但是它告訴我在EventExecutor
創建名為eventExecutor.execute(T)
,但隨后EventExecutor
拋出錯誤,因為它想要T
是我在同一包中創建的類。
我究竟做錯了什么?
編輯
所以基本上,最后,我希望不必強制轉換為想要的Event
類:
EventManager.call(event -> {
// Have this automatically be recognized as an instance of MyEventClass?
System.out.println(event.getText());
}, MyEventClass.class, new String("text"));
您可以call
通用方法嗎?
public static <T extends Event> void call(
EventExecutor<T> eventExecutor, Class<T> eventClass, Object... eventArgs) {
synchronized (LOCK) {
if (!checkIsEventClassRegistered(eventClass)) return;
try {
Class<?>[] constructorParameters = EventUtilities.getArrayOfClasses(
eventArgs);
Constructor<?> constructor = eventClass.getDeclaredConstructor(
constructorParameters);
T event = eventClass.cast(constructor.newInstance(eventArgs));
if (!callAllRegisteredMethods(event)) eventExecutor.execute(event);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意,我將Class.cast()
替換為對Class.cast()
的調用。
編輯: EventExecutor
必須具有通用性的唯一原因是,您想要傳遞匿名函數/類來執行,並且希望該函數/類取決於事件的實際類型。 為避免混淆,我將其稱為EventCallback
,因為EventExecutor
聽起來類似於java.util.concurrent.Executor
,所以我不知道您為什么想要多個。
順便說一句,在同步塊中調用太多不在您控制范圍內的代碼可能不是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.