public Interface Foo<T extends Colors>{...}
有没有办法检索为Foo的实现提供了哪个T?
例如,
public Class FooImpl implements Foo<Green>{..}
会回归绿色。
答案 0 :(得分:15)
与其他答案相反,您可以获取通用参数的类型。例如,将此添加到泛型类中的方法将获取类的第一个泛型参数(在您的情况下为T
):
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
type.getActualTypeArguments()[0]
我在我编写的通用Hibernate DAO中使用这种技术,因此我可以获得实际的类被持久化,因为Hibernate需要它。它有效!
答案 1 :(得分:9)
修改强>
在这种情况下,可以获得通用信息。 Singleshot发布了一个answer就是这么做的。他应该是公认的答案。重新认定我的。
一般情况下,在很多情况下,您无法获得可能存在的类型信息。 Java使用一种称为类型擦除的技术,它在编译时从泛型中删除类型。这可以防止您在许多情况下在运行时获取有关其实际绑定的信息。
关于这个问题的精彩常见问题:
答案 2 :(得分:1)
有。查看[Javadoc for java.lang.Class#getGenericInterfaces()](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces())。
像这样:
public class Test1 {
interface GenericOne<T> {
}
public class Impl implements GenericOne<Long> {
}
public static void main(String[] argv) {
Class c = (Class) ((ParameterizedType) Impl.class.getGenericInterfaces()[0]).getActualTypeArguments()[0];
System.out.println(c);
}
}
答案 3 :(得分:0)
执行此操作的一种方法是使用类型显式传入Class对象。如下所示:
public class FooImpl<T extends Colors> {
private Class<T> colorClass;
public FooImpl(T colorClass) {
this.colorClass = colorClass;
}
public Class<T> getColorClass() {
return colorClass;
}
}
答案 4 :(得分:0)
取决于你的意思。
只需T
即可,例如:
public Interface Foo<T extends Colors>{ public T returnType() {...} ...}
答案 5 :(得分:-2)
[编辑]好的,显然部分可能。如何做的很好的解释,(包括对SingleShot发布的方法的改进):http://www.artima.com/weblogs/viewpost.jsp?thread=208860