Как указать универсальный тип, когда тип известен только во время выполнения? - PullRequest
0 голосов
/ 06 января 2019

У меня есть некоторый код, который мне нужен для генерации универсального объекта на лету с универсальным типом 1 из набора подклассов: например, keyEvent, mouseEvent или appEvent, все они расширяются event. Итак, мой универсальный класс EventFunction требует шаблона, однако я не знаю, что это за тип класса, пока не получу событие, поэтому есть ли способ сделать следующее:

Event event = new KeyEvent(); // FOR EXAMPLE RECIEVING A KEY EVENT
// Require an EventFunction with that event class as the generic type
EventFunction<event.getClass()> func = new EventFunction<event.getClass()>(event);

Как мне сделать вышеупомянутое: то есть указать общие значения на лету? заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Обобщения существуют только для компилятора, чтобы проверить безопасность типов во время компиляции. Если ваш аргумент типа известен только во время выполнения, а не во время компиляции, нет смысла использовать там дженерики.

0 голосов
/ 06 января 2019

Вам может помочь следующий фрагмент:

class Event { }

class FooEvent extends Event { }

class EventFunction<T extends Event> {
    public EventFunction(T event) { }
}

class EventFunctionFactory {
   public <T extends Event> EventFunction<T> buildFunction(T event) {
       if (event.getClass().equals(FooEvent.class)) {
            System.out.println("A new FooEventFunction!");          
            return new EventFunction<T>(event);
       }
       else {
           return null;
       }
   }
}

Использование выглядит следующим образом:

    EventFunctionFactory factory = new EventFunctionFactory();
    Event foo = new FooEvent();
    EventFunction<Event> function = factory.buildFunction(foo);

Здесь у вас есть фрагмент

http://tpcg.io/bMNbkd

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...