Java List无法执行数学运算:泛型输入转换错误求助
问题解答
1. 为什么声明为Integer类型的列表会出现String类型?
核心原因是Java泛型的类型擦除加上无效的强制转换:
- 泛型是Java编译期的特性,运行时
UserInput<T>里的T会被擦除成Object,所以你写的(T) input.next()只是编译时的语法伪装,实际上input.next()返回的始终是String对象,并没有真正转换成Integer。 - 当你在主类里从
List<Integer>取元素并执行加法时,JVM才发现实际存储的是String,尝试强制转为Integer失败就抛出了ClassCastException。
2. 不使用数组流怎么解决这个问题?
提供两种实用方案,都不需要用到数组流:
方案一:基于类型判断的硬转换
修改UserInput类,通过传入的类型Class对象,对输入的字符串做对应类型转换:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class UserInput<T> { private List<T> inputs = new ArrayList<>(); private Class<T> type; // 新增构造方法,传入目标类型的Class对象 public UserInput(List<T> inputs, Class<T> type) { this.inputs = inputs; this.type = type; } public List<T> getUserInput(Integer number_inputs) { Scanner input = new Scanner(System.in); // 把Scanner移到循环外,避免重复创建 for(int i=1; i <= number_inputs; i++) { System.out.println("Enter number " + i); String inputStr = input.next(); T userInput = null; // 根据类型做具体转换 if (type == Integer.class) { userInput = type.cast(Integer.parseInt(inputStr)); } else if (type == Double.class) { userInput = type.cast(Double.parseDouble(inputStr)); } this.inputs.add(userInput); } input.close(); // 记得关闭IO资源 return this.inputs; } }
主类调用时传入Integer.class:
import java.util.ArrayList; import java.util.List; public class CalculateValues { public static void main(String[] args) { List<Integer> vals = new ArrayList<>(); UserInput<Integer> userInput = new UserInput<>(vals, Integer.class); List<Integer> inputValues = userInput.getUserInput(2); System.out.println(inputValues.get(0) + inputValues.get(1)); } }
方案二:传入类型转换器(更灵活)
定义一个转换函数,让UserInput类通过这个函数把字符串转成目标类型,不用硬编码判断:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.function.Function; public class UserInput<T> { private List<T> inputs = new ArrayList<>(); private Function<String, T> converter; // 构造方法传入转换逻辑 public UserInput(List<T> inputs, Function<String, T> converter) { this.inputs = inputs; this.converter = converter; } public List<T> getUserInput(Integer number_inputs) { Scanner input = new Scanner(System.in); for(int i=1; i <= number_inputs; i++) { System.out.println("Enter number " + i); String inputStr = input.next(); // 用转换器完成字符串到目标类型的转换 T userInput = converter.apply(inputStr); this.inputs.add(userInput); } input.close(); return this.inputs; } }
主类调用时直接传入对应类型的转换方法:
import java.util.ArrayList; import java.util.List; public class CalculateValues { public static void main(String[] args) { // Integer类型示例 List<Integer> vals = new ArrayList<>(); UserInput<Integer> userInput = new UserInput<>(vals, Integer::parseInt); List<Integer> inputValues = userInput.getUserInput(2); System.out.println(inputValues.get(0) + inputValues.get(1)); // Double类型示例,只需要换转换器 List<Double> doubleVals = new ArrayList<>(); UserInput<Double> doubleInput = new UserInput<>(doubleVals, Double::parseDouble); List<Double> doubleInputs = doubleInput.getUserInput(2); System.out.println(doubleInputs.get(0) + doubleInputs.get(1)); } }
内容的提问来源于stack exchange,提问作者Ry123
相关产品推荐
相关产品推荐

