2010-06-13 90 views
7

我有以下类获取参数化类参数的类型?

public class MyClass<T> { 
    public Class<T> getDomainClass() { 
      GET THE CLASS OF T 
    } 
} 

我GOOGLE了这个问题,我能找到的告诉我使用getGenericSuperClass()的所有答案,但这种方法的问题是,我必须有一个第二类扩展MyClass,我不想这样做。我需要的是获取具体类的参数化类型?

+0

您是否看到:http://stackoverflow.com/questions/1901164/get-type-of-a-generic-parameter-in-java-with-reflection? – Campa 2015-09-04 10:53:33

回答

5

你不能。由于类型擦除,所需信息(即T的值)在运行时不可用。

0

如果你需要知道你可能不应该使用泛型的类型。

3

由于类型擦除,获取它的唯一方法是将其作为显式参数传递 - 无论是在方法中,还是在构造函数中。

public class MyClass<T> { 
    public Class<T> getDomainClass(Class<T> theClass) { 
      // use theClass 
    } 
} 
3

我知道的唯一途径:

public class MyClass<T> { 

    private Class<T> clazz; 

    public MyClass(Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    public Class<T> getDomainClass() { 
     return clazz; 
    } 
} 

所以你基本上是提供运行时的信息,它不会从编译器有。

1

如果您想获得您继承的通用类型,您可以这样做!将此方法添加到您的课堂并获利! ;)

public Class<?> getGenericType() { 
    Class result = null; 
    Type type = this.getClass().getGenericSuperclass(); 

    if (type instanceof ParameterizedType) { 
     ParameterizedType pt = (ParameterizedType) type; 
     Type[] fieldArgTypes = pt.getActualTypeArguments(); 
     result = (Class) fieldArgTypes[0]; 
    } 

    return result; 
}