获取Java中的通用列表<! - ? - >对象的值

时间:2017-06-25 07:33:04

标签: java class generics

我正在尝试创建一个commonMethod,它接受Generic List allData类型并打印出收到的alldata对象的值。另外,我发送className作为参数,以便我们可以通过反射检索Class和Fields。

除了要在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
           }  
      }

 }
  

如何更改此部分    for(className c:alldata)让它工作..

由于

5 个答案:

答案 0 :(得分:2)

您不能按照您想要的方式执行此操作,因为将变量声明为某种类型(typeName variableName)是为您在编译时知道的类型名称保留的。

正确的方法是使用:

for (Object c : alldata) {

field.get(c)可以正常使用,因为the get method takes an Object,所以c将具有足够好的类型。

答案 1 :(得分:1)

将参数列表的泛型类型更改为具体而不是List<T> alldata,例如{{1}}。

答案 2 :(得分: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
           }  
      }

 }

答案 3 :(得分:1)

这个怎么样:

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

答案 4 :(得分:-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();
    }
}