【问题标题】:Testing whether a method's return type is a number?测试方法的返回类型是否为数字?
【发布时间】:2014-02-20 23:12:07
【问题描述】:

作为我所教课程的自动评分器的一部分,我希望能够测试学生是否编写了返回类型为数字类型的方法(intdoubleIntegerDouble 等)。我尝试这样做:

Method m = StudentClass.class.getDeclaredMethod(/* ... */);
return Number.class.isAssignableFrom(m.getReturnType());

如果方法的返回类型是IntegerDouble,此代码将正常工作,但如果它是intdouble,则不能正常工作。这让我很困惑,因为写是合法的

Number n = 137; // Assign an int to a Number

Number n = 1.608; // Assign a double to a Number

如果方法返回intdouble,为什么我上面写的代码不正确?除了硬编码测试结果是否为intlongchardouble等,我还能做些什么来测试该方法是否返回数字类型的结果?

谢谢!

【问题讨论】:

  • Ideone 为那些想玩的人提供样本。
  • 您可以使用Integer.TYPEDouble.TYPE 等:ideone.com/gBqT3H。枚举它们并不优雅,因为它们之间没有继承关系,但它可以完成工作。 (如果有帮助,我会稍微回答一下。)
  • 另一个选项是检查Class.isPrimitive(),并将非数字的原始类型列入黑名单,并可能添加非原始类型。我想您的根本问题是,在语言级别上,Java 并不真正关心“数字”这个概念。
  • Downvoter - 这个问题有什么问题我可以尝试改进吗?

标签: java class reflection casting numbers


【解决方案1】:

此解决方案并未触及根本原因,而是提供了一种解决方法。它不是很优雅,但考虑到它永远不会改变(除非 Java 以某种方式添加了新的数字类型),为了清晰起见,我愿意忍受它。

public class Main {
    private static List<String> validTypes = new ArrayList<String>() {{
        add("int");
        add("Integer");
        add("double");
        add("Double");
        add("long");
        add("Long");
        add("float");
        add("Float");
    }};
    public static void main(String[] args) {
        Main main = new Main();
        for(Method m : main.getClass().getDeclaredMethods()){
            System.out.println(m.getName() + ": " + validTypes.contains(m.getReturnType().getSimpleName()));
        }
    }

    public static int mInt(){ return 1; }

    public static Integer mInteger(){ return 1; }

    public static double mDouble(){ return 1.0; }

    public static Double mDoubleD(){ return 1.0; }
}

输出

main: false
mDoubleD: true
mInt: true
mInteger: true
mDouble: true

【讨论】:

    【解决方案2】:

    您遇到的问题是 int、long、double 是基元,根本不是对象,也不从 Number 继承。可能但不太可能有人可以在其中扮演自己的数字类版本,该数字类也没有从数字继承,这可能会使这个问题更难回答,但通常你可以做你的数字检查,然后对原语进行硬编码。

    另一种方法是使用一个值实际调用该方法并检查返回的值是否为数字,执行与上面的转换类似的操作并检查异常或在 String.valueof 结果上使用http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/math/NumberUtils.htmlisNumber。当然,完全有可能有人仍然可以编写一个可以做正确事情但未通过任何这些检查的类/方法。

    【讨论】:

    • 所有这些原始类型都必须有一个对应的Class 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2010-11-13
    • 2015-06-29
    相关资源
    最近更新 更多