作为我正在教授的课程的自动编排的一部分,我希望能够测试学生是否编写了一个返回类型为数字类型的方法(int
,double
, Integer
,Double
等)。我试着这样做:
Method m = StudentClass.class.getDeclaredMethod(/* ... */);
return Number.class.isAssignableFrom(m.getReturnType());
如果方法的返回类型为Integer
或Double
,则此代码将正常运行,但如果它是int
或double
则不会。这让我很困惑,因为写
Number n = 137; // Assign an int to a Number
和
Number n = 1.608; // Assign a double to a Number
如果方法返回int
或double
,为什么上面的代码没有正确写入?除了硬编码测试以查看结果是int
,long
,char
,double
等之外,我还能做些什么来测试方法是否返回结果数字类型?
谢谢!
答案 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