Java泛型 - 检索类型

时间:2009-11-03 20:48:04

标签: java generics

public Interface Foo<T extends Colors>{...}

有没有办法检索为Foo的实现提供了哪个T?

例如,

public Class FooImpl implements Foo<Green>{..}

会回归绿色。

6 个答案:

答案 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