测试方法的返回类型是否为数字?

时间:2014-02-20 23:12:08

标签: java class reflection casting numbers

作为我正在教授的课程的自动编排的一部分,我希望能够测试学生是否编写了一个返回类型为数字类型的方法(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等之外,我还能做些什么来测试方法是否返回结果数字类型?

谢谢!

2 个答案:

答案 0 :(得分:0)

你遇到的问题是int,long,double是原语而不是对象,并且不从Number继承。它可能但不太可能有人可以在那里有自己版本的数字类,也没有继承数字,这可能使这个问题更难回答但通常你会好的,你做你的数字检查,然后硬编码基元。

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

答案 1 :(得分:0)

此解决方案不会触及根本原因,而是提供解决方法。它不是很优雅,但考虑到它永远不会改变(除非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