2012-08-03 50 views
2

Java中有反映局部變量類型的方法嗎?我知道你對此有信心 - Get generic type of java.util.List。不知道如何解決,例如:運行時局部變量的一般類型

public void foo(List<String> s){ 
    //reflect s somehow to get String 
} 

甚至更​​普遍的:

public void foo<T>(List<T> s){ 
    //reflect s somehow to get T 
} 
+0

你到底想用s完成什麼?你能告訴我一個簡單的例子(僞代碼無關緊要) – 2012-08-03 16:00:59

+0

有了泛型,你可以做一些類似於public void foo T>(List s),如果這就是你想要的 – 2012-08-03 16:02:56

回答

1

Here是很好的教程,它展示瞭如何以及何時使用反射來讀取泛型。例如,從您的冷杉獲取字符串foo方法

public void foo(List<String> s) { 
    // .. 
} 

您可以使用此代碼

class MyClass { 

    public static void foo(List<String> s) { 
     // .. 
    } 

    public static void main(String[] args) throws Exception { 
     Method method = MyClass.class.getMethod("foo", List.class); 

     Type[] genericParameterTypes = method.getGenericParameterTypes(); 

     for (Type genericParameterType : genericParameterTypes) { 
      if (genericParameterType instanceof ParameterizedType) { 
       ParameterizedType aType = (ParameterizedType) genericParameterType; 
       Type[] parameterArgTypes = aType.getActualTypeArguments(); 
       for (Type parameterArgType : parameterArgTypes) { 
        Class parameterArgClass = (Class) parameterArgType; 
        System.out.println("parameterArgClass = " 
          + parameterArgClass); 
       } 
      } 
     } 
    } 
} 

輸出:parameterArgClass =類java.lang.String

這是可能的,因爲你的在源代碼中明確聲明List只能包含字符串。然而,在案件

public <T> void foo2(List<T> s){ 
     //reflect s somehow to get T 
} 

T可以是任何東西,是因爲類型擦除是不可能的檢索提供精準的T類信息。

6

沒有。由於Java的Type Erasure,所有泛型在編譯過程中被剝離。

但是,您可以在列表中的元素上使用instanceOfgetClass以查看它們是否與特定類型匹配。

+1

但是你仍然可以做在該領域同樣的事情,所以信息存儲在某處... – Bober02 2012-08-03 15:52:25

+1

字段是不同的,因爲它們的確切泛型類型靜態存儲在類文件中。約翰是正確的:你不能這樣做。 – 2012-08-03 15:55:52