2012-07-30 62 views
2

尼爾Gafter介紹type tokens(例如Class<String>)。假設在運行時可以訪問Class<String>的實例,是否可以在運行時檢索通用類型(String)?是否可以在運行時檢索用於類型令牌的通用類型(即類別<T>)?

我在尋找類似於Method.getGenericReturnType()的東西。

+1

不知道你的意思。如果你已經有了Class實例,你還想要什麼? – jtahlborn 2012-07-30 18:19:34

+0

用作通用參數的類型。 – JVerstry 2012-07-30 18:28:51

+1

_what_?一個類實例或某個類型的名字?也許你可以添加一些僞代碼,說明你正在尋找什麼...... – jtahlborn 2012-07-30 18:41:25

回答

0

有可能使用Gafter的小工具模式的鮑勃·李的闡述的變化:

public class GenericTypeReference<T> { 

    private final Type type; 

    protected GenericTypeReference() { 
     Type superclass = getClass().getGenericSuperclass(); 
     if (superclass instanceof Class) { 
      throw new RuntimeException("Missing type parameter."); 
     } 
     this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0]; 
    } 

    public Type getType() { 
     return this.type; 
    } 

    public static void main(String[] args) { 

     // This is necessary to create a Class<String> instance 
     GenericTypeReference<Class<String>> tr = 
      new GenericTypeReference<Class<String>>() {}; 

     // Retrieving the Class<String> instance 
     Type c = tr.getType(); 

     System.out.println(c); 
     System.out.println(getGenericType(c)); 

    } 

    public static Type getGenericType(Type c) { 
     return ((ParameterizedType) c).getActualTypeArguments()[0]; 
    } 

} 

上面的代碼打印:

java.lang.Class<java.lang.String> 
class java.lang.String 
2

我認爲它只適用於字段/方法。由於類型擦除,我們無法在運行時獲得類特定的泛型類型。如果你有上課的機會,你似乎可以進行破解。閱讀discussion

+0

+1提及刪除類型。 – 2012-07-30 18:22:49

+0

實際上,只要它是類型聲明的一部分,就可以在運行時檢索類型信息。這就是黑客所指的...... – Jonathan 2012-07-30 21:31:18

+0

嗯,我找到了一個解決方案...所以它也可能是類! – JVerstry 2012-07-30 21:39:17

1

與C#不同,泛型在Java中的運行時不存在。因此,您不能嘗試創建泛型類型的實例,或嘗試在運行時查找泛型類型。

+1

錯誤,通用信息可用作元數據,否則,Method.getGenericReturnType()如何工作? – JVerstry 2012-07-30 18:27:37

+1

我正在談論一些泛型類型T,並且你正在討論帶有泛型類型T的參數或返回類型的方法。 – 2012-07-30 18:38:24

+0

是的,沒錯。他們是一樣的。 – JVerstry 2012-07-30 18:41:30

1

這聽起來像你想要的是ParameterizedType

您通過反思Class和來自它的物體(Method,Field)得到這些結果。但是,您無法從任何舊的Class對象獲取ParameterizedType;您可以從代表擴展泛型類或接口的類型的Class實例中獲得一個實例。

+0

好的,但那麼,如何專門進行? – JVerstry 2012-07-30 21:37:07