簡體   English   中英

Java:通過實際 <T extends Event> 類。 (通用問題)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM