我想动态判断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/Double
是Number
的子类,但Number.class
不等于Double.class
。我可以使用像
if(obj.getClass().equals(Integer.class) || obj.getClass().equals(Float.class) || obj.getClass().equals(Double.class))
但它看起来太冗长了。那么有一个简单的方法吗?
答案 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)){
}
确定指定的Object是否与此Class表示的对象分配兼容。此方法是Java语言instanceof运算符的动态等效项。如果指定的Object参数为非null,则该方法返回true,并且可以强制转换为此Class对象表示的引用类型,而不会引发ClassCastException。否则返回false。