2010-06-13 91 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; 
}