如何使用getClass()来判断Object是否为数字?

时间:2013-09-12 20:02:14

标签: java reflection

我想动态判断Java中的Object是否为数字。我的代码如下:

if(obj.getClass().equals(Number.class)) {
    attributeTypeStr = "Numeric";
} else {
    attributeTypeStr = "Non-Numeric";
}

Object obj可以是Integer, Float, Double等任何数字类型。但是当我使用Integer/Float/Double对其进行测试时,attributeTypeStr始终会返回"Non-Numeric"。我想这是因为Integer/Float/DoubleNumber的子类,但Number.class不等于Double.class。我可以使用像

这样的东西
if(obj.getClass().equals(Integer.class) || obj.getClass().equals(Float.class) || obj.getClass().equals(Double.class))

但它看起来太冗长了。那么有一个简单的方法吗?

4 个答案:

答案 0 :(得分:15)

使用instanceof

if (obj instanceof Number)

答案 1 :(得分:7)

使用陈述<{p>的Class#isAssignableFrom(Class)

  

确定此Class对象所表示的类或接口   与...相同或者是超类或超级接口   由指定的Class参数表示的类或接口。

否则

Integer obj = new Integer(2);       
System.out.println(Number.class.isAssignableFrom(obj.getClass()));
因此,

将打印true

这可能与您的问题无关,但只是fyi:

答案 2 :(得分:1)

检查其超类。这适用于这些类是直接超类:

if(obj.getClass().getSuperclass().equals(Number.class)){
    //logic
}

或者对于非直接,请检查Number.class.isAssignableFrom(obj.getClass())。对于数字,它不应该是一个很大的问题,因为现有的Number子类是 final 。在漫画中,由于缺少类型信息,这可能会中断。

答案 3 :(得分:1)

使用isInstance()

Class方法
if(Number.class.isInstance(obj)){
}

根据Class#isInstance()

  

确定指定的Object是否与此Class表示的对象分配兼容。此方法是Java语言instanceof运算符的动态等效项。如果指定的Object参数为非null,则该方法返回true,并且可以强制转换为此Class对象表示的引用类型,而不会引发ClassCastException。否则返回false。