我是 Java 的新手,需要根据从用户输入添加到列表中的值来处理
List
/ ArrayList
的一些说明。
用户输入是从具有
UserInput
方法的getUserInput()
类获得的。此方法接受一个整数 number_inputs
并返回长度为 number_inputs
的用户输入列表。输入类型可能不同(用户可以输入 Integer 或 Double)因此它是通用类型 T
.
UserInput
类看起来像这样:
public class UserInput<T> {
private List<T> inputs = new ArrayList<>();
public UserInput(List<T> inputs) {
this.inputs = inputs;
}
public List<T> getUserInput(Integer number_inputs) {
for(int i=1; i < number_inputs+1; i++) {
Scanner input = new Scanner(System.in);
System.out.println("Enter number " + i);
T userInput = (T) input.next();
this.inputs.add(userInput);
}
return this.inputs;
}
}
getUserInputs()
然后在主类CalculateValues
中被调用。给定返回的用户输入列表,我想对这些值执行数学运算(例如求和、除法等)。但是下面的代码无法处理错误:
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
public class CalculateValues {
public static void main(String[] args) {
List<Integer> vals = new ArrayList<>();
UserInput<Integer> userInput = new UserInput<>(vals);
List<Integer> inputValues = userInput.getUserInput(2);
System.out.println(inputValues.get(0) + inputValues.get(1)); // Error occurs here
}
}
有没有办法不使用数组流来做到这一点?我主要困惑为什么显示错误,因为我在
inputValues
中的列表值已经输入为整数,那么为什么编译器将我的列表值检测为字符串?
我建议的第一件事是减少泛型
T
的范围,并简单地使用一个Number
对象。这将涵盖Double
和Integer
.
您需要做的是检查
input
中的值。input.next
,使用input.nextLine
。
如果该值包含小数点,则将其添加到
inputs
作为Double
,否则将其添加为Integer
.
public class UserInput {
private List<Number> inputs;
public UserInput(List<Number> inputs) {
this.inputs = inputs;
}
public List<Number> getUserInput(Integer number_inputs) {
String string;
for(int i=1; i < number_inputs+1; i++) {
Scanner input = new Scanner(System.in);
System.out.println("Enter number " + i);
string = input.nextLine();
if (string.contains(".")) {
this.inputs.add(Double.parseDouble(string));
} else {
this.inputs.add(Integer.parseInt(string));
}
}
return this.inputs;
}
}
然后,在您的
CalculateValues
课程中,您需要区分结果,并相应地添加。
public class CalculateValues {
public static void main(String[] args) {
List<Number> vals = new ArrayList<>();
UserInput userInput = new UserInput(vals);
List<Number> inputValues = userInput.getUserInput(2);
Number numberA = inputValues.get(0);
Number numberB = inputValues.get(1);
if (numberA instanceof Integer && numberB instanceof Integer)
System.out.println(numberA.intValue() + numberB.intValue());
else if (numberA instanceof Integer && numberB instanceof Double)
System.out.println(numberA.intValue() + numberB.doubleValue());
else if (numberA instanceof Double && numberB instanceof Integer)
System.out.println(numberA.doubleValue() + numberB.intValue());
else if (numberA instanceof Double && numberB instanceof Double) {
System.out.println(numberA.doubleValue() + numberB.doubleValue());
}
}
}
理想情况下,您可以将所有值存储为
Double
,它有足够的空间容纳Integer
.