我有一个参数化类:如何才能学习泛型类的实际类型参数?
class ParameterizedClass<T extends AbstractSomething> {
}
呼吁:
new ParameterizedClass<Something>();
那么,如何可以通过使用Java的泛型获得T
实际类型的东西吗?
我有一个参数化类:如何才能学习泛型类的实际类型参数?
class ParameterizedClass<T extends AbstractSomething> {
}
呼吁:
new ParameterizedClass<Something>();
那么,如何可以通过使用Java的泛型获得T
实际类型的东西吗?
它可以做到,但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
是完全通用和类型安全的,你仍然可以访问类对象。
编辑:解决的评论
你可以在你的构造函数中使用这种伎俩:(见http://www.hibernate.org/328.html)
Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
但我相信这个代码仅在类是子类和子类的实例来执行它的工作原理。
我知道这个技巧,并且正在使用DAO类。但这不是我所看到的。为了使用这个技巧,我想我们必须在源代码上定义父类的泛型类型的实际值。 GenericDAO
如果你是指从物体本身,你不能。 类型删除意味着信息丢失。
如果你有场与具体类型参数使用参数化类型,虽然,那信息保留。
参见Angelika Langer's Generics FAQ,特别是section on type erasure。
这是一个主要问题的话题,因为它像预期(在复杂的场景expecially)在一定条件下才有效。
但是Xebia发布了一个good article整件事情。
它可能是***。这个答案是错误的。检查解决方案的其他答案。 – 2017-04-07 19:46:05
@AdamArold在我写答案的时候,我还不知道它,但你是对的。但我仍然不推荐它。我相应地更新了我的答案。 – jqno 2017-04-13 06:40:04