有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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.

然而,一旦输入一个值并按下enter键,我通常会得到一个类强制转换异常。我的最终目标是使用数组params来构造指定类的新对象

如何将用户输入转换为预期类型


共 (1) 个答案

  1. # 1 楼答案

    从输入中读取时:

    params[i] = sc.nextLine();
    

    将一个Object放在params[i]中,它是String(返回类型为nextLine())。 如果你期望从输入中得到一个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 ...
    

    或者,您可以使用hasNextInt()测试Scanner中的类型,并使用nextInt()读取正确的类型。但是无论如何,你必须在不同的输入类型上有一些if () else if的东西或switch case