仅在运行时知道通用类型时如何指定通用类型?

时间:2019-01-05 22:48:55

标签: java class object templates generics

我需要一些代码来动态生成一组子类的泛型类型为1的泛型对象: keyEventmouseEventappEvent,它们都扩展了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 :(得分:1)

以下代码段可能会对您有所帮助:

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

答案 1 :(得分:0)

仅泛型供编译器在编译时检查类型安全。如果您的类型参数仅在运行时才知道,而在编译时才知道,那么就没有必要使用泛型了。