2017-06-25 25 views
1

我正在嘗試創建一個commonMethod,它符合通用列表allData類型並打印出接收到的alldata對象的值。此外,我將className作爲參數發送,以便我們可以通過反射檢索Class和Fields。獲取Java中的通用列表<?>對象的值

除了我想在forloop中聲明className的部分外,我幾乎在那裏。我知道其餘的代碼工作,因爲我試圖硬編碼一個ClassName,它的工作原理。

public void commonMethod(List<?> alldata, String className) { 
     Class c = Class.forName(className); 
     Field[] fields = c.getDeclaredFields(); 

    //I would like to define incoming className here..but failing 
     for (className c : alldata) { 
      for (Field field : fields) { 
       field.setAccessible(true); 
       Object value = null; 
       value = field.get(c); 
       System.out.println(value); 
       //use the value in some other code 
      } 
     } 

} 

如何改變這一部分 爲(的className C:ALLDATA)得到它的工作..

感謝

+5

'for(Object c:allData)''。 –

+1

您可以輸入方法:'public void commonMethod(List alldata,Class c){ /* removed:Class c = Class.forName(className); * /'然後使用T –

回答

2

你不能做到這一點,你所希望的方式,因爲在聲明變量是這樣的某種類型(typeName variableName)是爲在編譯時知道的類型名稱保留的。

正確的方法是使用:

for (Object c : alldata) { 

field.get(c)的工作只是這個很好的,因爲the get method takes an Object,所以c將有足夠好的類型。

1

更改泛型類型參數列表具體而不是?,例如List<T> alldata

1

我建議你修改如下代碼,以適應泛型

public <T>void commonMethod(List<T> alldata) { 
     for (T c : alldata) { 
      .... 
      ..... 
     } 

} 

現在不管類,你提供,編譯器會很容易理解它需要對可變c鑄造成什麼課。

還有更好的是什麼,是由RC提出的意見:

public <T> void commonMethod(List<T> alldata, Class<T> c) { 
     Field[] fields = c.getDeclaredFields(); 

     for (T c : alldata) { 
      for (Field field : fields) { 
       field.setAccessible(true); 
       Object value = null; 
       value = field.get(c); 
       System.out.println(value); 
       //use the value in some other code 
      } 
     } 

} 
+1

答案的第一部分是不必要的:只要將循環變量類型改爲'Object';除了較短的類型,你從類型變量中什麼也沒有得到。另一方面,第二部分是好的。我改變的唯一辦法就是使它成爲'Class '(或'List '),使它更加靈活一點。 –

1

如何:

public <T> void commonMethod(List<T> alldata) { 
    // do something 
} 
+0

當然;但是這比'''和'Object'沒有任何優勢。 –

-1

您應該從每個元素而不是參數獲得Class

static void commonMethod(List<Object> alldata) throws IllegalArgumentException, IllegalAccessException { 
    for (Object obj : alldata) { 
     Class<?> clazz = obj.getClass(); 
     for (Field f : clazz.getFields()) { 
      f.setAccessible(true); 
      System.out.print(" " + f.getName() + "=" + f.get(obj)); 
     } 
     System.out.println(); 
    } 
} 
相關問題