Java 返回泛型列表
我试图创建一个方法来返回泛型对象列表,但得到了一个ClassCastExceptionJava 返回泛型列表,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
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;
}
}