请求用户输入构造函数的参数?

时间:2015-03-11 21:48:52

标签: java reflection

所以我使用反射来构造用户定义的类;我向用户询问类的名称,以及该类的首选构造函数有多少参数。

然后,程序找到要使用的正确构造函数。一切正常,这是我的代码的相关部分:

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来构造指定类的新对象。

如何将用户输入适当地转换为预期类型?

1 个答案:

答案 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 ...

或者您可以使用ScannerhasNextInt()测试类型,并使用nextInt()阅读正确的类型。但无论如何,你必须在不同的输入类型上有某种if () else if内容或switch case

相关问题