2010-08-19 52 views

回答

9

它可以做到,但type erasure可以使它很难。正如其他答案所讨论的那样,您必须创建一个ParameterizedClass的子类或将T类型的字段添加到ParameterizedClass,并且您需要执行的反射代码是复杂的。

我建议在这种情况下是什么,是要解决的问题是这样的:

class ParameterizedClass<T> { 
    private Class<T> type; 

    /** Factory method */ 
    public static <T> ParameterizedClass<T> of(Class<T> type) { 
     return new ParameterizedClass<T>(type); 
    } 

    /** Private constructor; use the factory method instead */ 
    private ParameterizedClass(Class<T> type) { 
     this.type = type; 
    } 

    // Do something useful with type 
} 

由于Java的类型推断的静态方法,你可以构造你的类没有太多额外的样板:

ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class); 

这样,你的ParameterizedClass是完全通用和类型安全的,你仍然可以访问类对象。

编辑:解决的评论

+0

它可能是***。这个答案是错误的。检查解决方案的其他答案。 – 2017-04-07 19:46:05

+0

@AdamArold在我写答案的时候,我还不知道它,但你是对的。但我仍然不推荐它。我相应地更新了我的答案。 – jqno 2017-04-13 06:40:04

8

你可以在你的构造函数中使用这种伎俩:(见http://www.hibernate.org/328.html

Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

但我相信这个代码仅在类是子类和子类的实例来执行它的工作原理。

+0

我知道这个技巧,并且正在使用DAO类。但这不是我所看到的。为了使用这个技巧,我想我们必须在源代码上定义父类的泛型类型的实际值。 GenericDAO UserDAO扩展GenericDAO TanerDiler 2010-08-19 08:59:06

0

这是一个主要问题的话题,因为它像预期(在复杂的场景expecially)在一定条件下才有效。

但是Xebia发布了一个good article整件事情。