Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回泛型列表_Java_List_Generics - Fatal编程技术网

Java 返回泛型列表

Java 返回泛型列表,java,list,generics,Java,List,Generics,我试图创建一个方法来返回泛型对象列表,但得到了一个ClassCastException HashMap<String, String> dados = new HashMap<>(); List<HashMap<String, String>> result = new ArrayList<>(); dados.put("sigla", "TST"); dados.put("nome", "Teste"); result.add(da

我试图创建一个方法来返回泛型对象列表,但得到了一个ClassCastException

HashMap<String, String> dados = new HashMap<>();
List<HashMap<String, String>> result = new ArrayList<>();

dados.put("sigla", "TST");
dados.put("nome", "Teste");
result.add(dados);

List<Posto> dadosProcessados = convertDados(Posto.class, result);

for (Posto posto : dadosProcessados) { //ClassCastException line 38
    System.out.println(posto.getSigla() + " => " + posto.getNome());
}
HashMap dados=newhashmap();
列表结果=新建ArrayList();
护墙板放置(“sigla”、“TST”);
护墙板放置(“nome”、“Teste”);
结果:添加(护墙板);
List-dadoprocessados=convertDados(Posto.class,result);
对于(Posto-Posto:dadoprocessados){//ClassCastException行38
System.out.println(posto.getSigla()+“=>”+posto.getNome());
}
下面是完整的方法:

public static <T> List<T> convertDados(Class<T> entity, List<HashMap<String, String>> dados) throws NoSuchMethodException, 
SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
    Field[] fields = entity.getDeclaredFields();
    Method[] allSetterMethods = entity.getMethods();
    Map<Integer, Method> setters = new HashMap<>();
    Class<?>[] paramTypes = new Class<?>[fields.length -1];
    List<T> result = new ArrayList<>();
    int cont  = 0;

    //Pega todos os setter
    for(Method method : allSetterMethods) {         
        if(method.getName().startsWith("set")) {
            paramTypes[cont] = method.getParameterTypes()[0];
            setters.put(cont, method);
            cont++;
        }
    }

    for (Field field : fields) {            
        for(Map.Entry<String, String> dado: dados.get(0).entrySet()) {
            if(dado.getValue() != null && field.getName().equals(dado.getKey())) {
                for(Map.Entry<Integer, Method> set : setters.entrySet()) {
                    if(set.getValue().getName().substring(3).equalsIgnoreCase(field.getName())) {
                        Method method = entity.getMethod(set.getValue().getName(), paramTypes[set.getKey()]);
                        method.invoke(entity.getConstructor().newInstance(), dado.getValue());
                        result.add((T) entity);
                        break;
                    }
                }
            }
        }
    }
publicstaticlist-convertDados(类实体,列表数据)抛出NoSuchMethodException,
SecurityException、IllegalAccessException、IllegalArgumentException、InvocationTargetException、InstanceionException{
Field[]fields=entity.getDeclaredFields();
方法[]allSetterMethods=entity.getMethods();
Map setters=newhashmap();
Class[]paramTypes=新类[fields.length-1];
列表结果=新建ArrayList();
int cont=0;
//佩加托多斯塞特
对于(方法:allSetterMethods){
if(method.getName().startsWith(“set”)){
paramTypes[cont]=method.getParameterTypes()[0];
setters.put(cont,method);
cont++;
}
}
对于(字段:字段){
对于(Map.Entry dado:dados.get(0.entrySet()){
如果(dado.getValue()!=null&&field.getName().equals(dado.getKey())){
for(Map.Entry集:setters.entrySet()){
if(set.getValue().getName().substring(3.equalsIgnoreCase(field.getName())){
方法Method=entity.getMethod(set.getValue().getName(),paramTypes[set.getKey()]);
调用(entity.getConstructor().newInstance(),dado.getValue());
结果。添加((T)实体);
打破
}
}
}
}
}
stacktrace错误

线程“main”java.lang.ClassCastException中的异常:java.lang.Class无法转换为beans.Teste.main(Teste.java:38)处的data.bo.Posto


您正在将
result.add((T)entity);
添加到结果中。entity是您传入的参数,它是一个类,而不是您想要的类型的实例

也许您想将
entity.getConstructor().newInstance()的结果添加到列表中?

更改结果.add((T)entity);使用T obj=entity.getConstructor().newInstance()

import java.lang.reflect.Field;
导入java.lang.reflect.InvocationTargetException;
导入java.lang.reflect.Method;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共班机{
公共静态void main(字符串[]args)引发异常{
列表结果=新建ArrayList();
HashMap dados=新HashMap();
护墙板放置(“sigla”、“TST”);
护墙板放置(“nome”、“Teste”);
结果:添加(护墙板);
List-dadoprocessados=convertDados(Posto.class,result);
for(Posto Posto:dadoprocessados){
System.out.println(posto.getSigla()+“=>”+posto.getNome());
}
}
公共静态列表转换数据对象(类实体,列表数据对象)抛出NoSuchMethodException,
SecurityException、IllegalAccessException、IllegalArgumentException、InvocationTargetException、InstanceionException{
Field[]fields=entity.getDeclaredFields();
方法[]allSetterMethods=entity.getMethods();
Map setters=newhashmap();
Class[]paramTypes=新类[fields.length];
列表结果=新建ArrayList();
int cont=0;
for(方法:allSetterMethods){
if(method.getName().startsWith(“set”)){
paramTypes[cont]=method.getParameterTypes()[0];
setters.put(cont,method);
cont++;
}
}
用于(字段:字段){
对于(Map.Entry dado:dados.get(0.entrySet()){
if(dado.getValue()!=null&&field.getName().equalsIgnoreCase(dado.getKey()){
for(Map.Entry集:setters.entrySet()){
if(set.getValue().getName().substring(3.equalsIgnoreCase(field.getName())){
方法Method=entity.getMethod(set.getValue().getName(),paramTypes[set.getKey()]);
T obj=entity.getConstructor().newInstance();
调用(obj,dado.getValue());
结果:添加(obj);
打破
}
}
}
}
}
返回结果;
}
}

错误是什么?你能包括stacktrace吗?
线程“main”java.lang.ClassCastException:java.lang.Class中的异常不能在beans.Teste.main(Teste.java:38)转换为data.bo.Posto
Teste.java的第38行是什么?for(Posto Posto:dadoprocessados)。这是第38行这行
结果。添加((T)实体)
毫无意义。请重新检查什么是
实体,以及它是否真的是您想要添加到列表中的实体。
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
  public static void main(String[] args) throws Exception {
    List<HashMap<String, String>> result = new ArrayList<>();

    HashMap<String, String> dados = new HashMap<>();

    dados.put("sigla", "TST");
    dados.put("nome", "Teste");
    result.add(dados);

    List<Posto> dadosProcessados = convertDados(Posto.class, result);

    for (Posto posto : dadosProcessados) {
      System.out.println(posto.getSigla() + " => " + posto.getNome());
    }

  }


  public static <T> List<T> convertDados(Class<T> entity, List<HashMap<String, String>> dados) throws NoSuchMethodException,
      SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
    Field[] fields = entity.getDeclaredFields();
    Method[] allSetterMethods = entity.getMethods();
    Map<Integer, Method> setters = new HashMap<>();
    Class<?>[] paramTypes = new Class<?>[fields.length];
    List<T> result = new ArrayList<>();
    int cont = 0;

    for (Method method : allSetterMethods) {
      if (method.getName().startsWith("set")) {
        paramTypes[cont] = method.getParameterTypes()[0];
        setters.put(cont, method);
        cont++;
      }
    }

    for (Field field : fields) {
      for (Map.Entry<String, String> dado : dados.get(0).entrySet()) {
        if (dado.getValue() != null && field.getName().equalsIgnoreCase(dado.getKey())) {
          for (Map.Entry<Integer, Method> set : setters.entrySet()) {
            if (set.getValue().getName().substring(3).equalsIgnoreCase(field.getName())) {
              Method method = entity.getMethod(set.getValue().getName(), paramTypes[set.getKey()]);
              T obj = entity.getConstructor().newInstance();
              method.invoke(obj, dado.getValue());
              result.add(obj);
              break;
            }
          }
        }
      }
    }

    return result;
  }
}