44

可能重复:
如何确定对象的类(在 Java 中)?
Java判断一个对象是哪个类

我有以下示例不完整的方法来比较给定对象的对象类型

public void test(Object value) {

        if (value.getClass() == Integer) {
            System.out.println("This is an Integer");
        }else if(value.getClass() == String){
            System.out.println("This is a String");
        }else if(value.getClass() == Float){
            System.out.println("This is a Float");
        }

}

该方法可以调用为:

test("Test");
test(12);
test(10.5f);

此方法实际上不起作用,请帮助我使其起作用

4

4 回答 4

72

你忘记了.class

if (value.getClass() == Integer.class) {
    System.out.println("This is an Integer");
} 
else if (value.getClass() == String.class) {
    System.out.println("This is a String");
}
else if (value.getClass() == Float.class) {
    System.out.println("This is a Float");
}

请注意,这种代码通常是糟糕的 OO 设计的标志。

另请注意,将对象的类与类进行比较和使用 instanceof 不是一回事。例如:

"foo".getClass() == Object.class

是假的,而

"foo" instanceof Object

是真的。

是否必须使用其中一种取决于您的要求。

于 2012-05-10T09:51:49.110 回答
26

您可以将类标记相互比较,因此您可以使用value.getClass() == Integer.class. 但是,更简单、更规范的方法是使用instanceof

    if (value instanceof Integer) {
        System.out.println("This is an Integer");
    } else if(value instanceof String) {
        System.out.println("This is a String");
    } else if(value instanceof Float) {
        System.out.println("This is a Float");
    }

笔记:

  • 两者之间的唯一区别是比较类标记只检测完全匹配,而instanceof C对子类的匹配也是C如此。但是,在这种情况下,列出的所有类都是final,因此它们没有子类。因此instanceof这里可能很好。
  • 正如 JB Nizet 所说,这样的检查不是面向对象的设计。您可能能够以更面向对象的方式解决此问题,例如

    System.out.println("This is a(n) " + value.getClass().getSimpleName());
    
于 2012-05-10T09:51:31.370 回答
7

你想要instanceof

if (value instanceof Integer)

即使对于子类也是如此,这通常是您想要的,而且它也是空安全的。如果你真的需要完全相同的课程,你可以这样做

if (value.getClass() == Integer.class)

或者

if (Integer.class.equals(value.getClass())
于 2012-05-10T09:51:58.363 回答
4

利用value instanceof YourClass

于 2012-05-10T09:51:58.253 回答