2017-06-25 31 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(); 
    } 
} 
相关问题