8

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

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/Doubleare 的子类NumberNumber.class不等于Double.class. 我可以使用类似的东西

if(obj.getClass().equals(Integer.class) || obj.getClass().equals(Float.class) || obj.getClass().equals(Double.class))

但它看起来太冗长了。那么有没有一种简单的方法可以做到这一点?

4

4 回答 4

15

使用instanceof

if (obj instanceof Number)
于 2013-09-12T20:05:13.137 回答
7

使用Class#isAssignableFrom(Class)哪些状态

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。

正在做

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

因此将打印true.

它可能与您的问题无关,但仅供参考:

于 2013-09-12T20:03:27.490 回答
1

检查它的超类。这是因为这些类是直接超类:

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

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

于 2013-09-12T20:04:22.113 回答
1

的使用isInstance()方法Class

if(Number.class.isInstance(obj)){
}

根据Class#isInstance()

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

于 2013-09-12T20:10:32.003 回答