所以我使用反射来构造用户定义的类;我向用户询问类的名称,以及该类的首选构造函数有多少参数。
然后,程序找到要使用的正确构造函数。一切正常,这是我的代码的相关部分:
Object[] params = new Object[numParams];
Class<?>[] paramTypes = ctor.getParameterTypes();
for (int i = 0; i < numParams; i++) {
System.out.format("Enter a value of type %s.\n", paramTypes[i].getName());
params[i] = sc.nextLine();
paramTypes[i].cast(params[i]);
}
numParams
是指定构造函数ctor
中的参数数量。
因此,正如您所看到的,我要求用户输入由构造函数中的参数类型指定的类型变量。
类型输出正常(例如,如果构造函数的第一个参数是int
,程序会说Enter a value of type int.
。
但是,输入一个值并按下回车键后,我通常会得到一个类强制转换异常。我的最终目标是使用数组params
来构造指定类的新对象。
如何将用户输入适当地转换为预期类型?
答案 0 :(得分:1)
当您从输入中读取时:
params[i] = sc.nextLine();
您将Object
String
(返回类型nextLine()
)放入params[i]
。
如果您对输入的期望是int,那么只是转换不会这样做。转换不会改变值的性质,它只会欺骗编译器。
您需要解析输入以计算正确类型中的正确值。在某些时候,您将不得不测试不同的输入类型以创建正确的对象类型,例如
if (paramType[i] == Integer.class) {
Integer parInt = Integer.valueOf(params[i]); // params[i] is a String
params[i] = parInt; // params[i] is now an Integer
}
else if (paramType[i] == String.class) {
//
}
else if ...
或者您可以使用Scanner
从hasNextInt()
测试类型,并使用nextInt()
阅读正确的类型。但无论如何,你必须在不同的输入类型上有某种if () else if
内容或switch case
。