51

对于这个例子:

public class Foo{}

public class Bar extends Foo{}

....

void myMethod(Foo qux){
   if (checkInstance(qux,Foo.class)){
     ....
   }
}

如何检查是否qux是 Foo 的实例(但不是 foo 的子类的实例)?那是:

  • checkInstance(qux,Foo.class)=true
  • checkInstance(qux,Bar.class)=false

instanceof是否有类似此检查的某种声明?或者我应该使用qux.getClass().equals(Foo.class)

4

7 回答 7

72

如果您必须这样做,唯一的方法就是getClass().equals(Foo.class)您建议的选项。

但是,OO 设计的目标是让您以同样的方式对待任何 Foo事物。实例是否是子类在普通程序中应该是无关紧要的。

于 2013-05-22T09:53:17.727 回答
7

如果您正在寻找完全匹配的类,唯一的方法是qux.getClass().equals(Foo.class). instanceof 也将为子类返回 true。

于 2013-05-22T09:53:07.667 回答
4

你应该使用 instanceof

if(qux instanceof Foo && !(qux instanceof Bar)) {
    ...
}

这适用于类和接口,因此在大多数情况下,它应该优先于.class哪些不适用于接口。

于 2013-05-22T09:52:19.763 回答
2

我刚刚尝试了以下代码,似乎工作正常

public class BaseClass {

    private String a;

    public boolean isInstanceOf(BaseClass base){
        if(base == null){
            return false;
        }
        else if(getClass() == base.getClass()){
            return true;
        }else{
            return false;
        }
    }

}



public class DervidClass extends BaseClass {


    public boolean isInstanceOf(DervidClass base) {
        if(base == null){
            return false;
        }
        else if(getClass() == base.getClass()){
            return true;
        }else{
            return false;
        }
    }


}

public class myTest {
public static void main(String[] args) throws ParseException {


        BaseClass base = new BaseClass();
        BaseClass base1 = new BaseClass();
        DervidClass derived = new DervidClass();

        BaseClass d1 = new DervidClass();

        System.out.println(base.isInstanceOf(d1));
        System.out.println(d1.isInstanceOf(d1));
        System.out.println((d1 instanceof BaseClass));


    }
于 2013-05-22T10:17:17.707 回答
2

我已经阅读了迄今为止发布的所有答案,但还没有找到满意的答案。回答此检查是否有某种声明?instanceof或者我应该使用qux.getClass().equals(Foo.class)我会说是的问题,instanceofjava中有运算符来检查对象是否是类的实例。下面是一个例子-:

class Vehicle {

}

class Car extends Vehicle {

}

public class Research {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();

        if (vehicle instanceof Vehicle) {
            System.out.println("vehicle instanceof Vehicle : TRUE");
        } else {
            System.out.println("vehicle instanceof Vehicle : FALSE");
        }

        if (vehicle instanceof Car) {
            System.out.println("vehicle instanceof Car : TRUE");
        } else {
            System.out.println("vehicle instanceof Car : FALSE");
        }

        System.out.println();
        Car car = new Car();

        if (car instanceof Vehicle) {
            System.out.println("car instanceof Vehicle : TRUE");
        } else {
            System.out.println("car instanceof Vehicle : FALSE");
        }

        if (car instanceof Car) {
            System.out.println("car instanceof Car : TRUE");
        } else {
            System.out.println("car instanceof Car : FALSE");
        }
    }
}

输出-:

vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE

car instanceof Vehicle : TRUE
car instanceof Car : TRUE

描述-:instanceof运算符告诉对象是类的实例还是它的父类(直到任何级别)。
vehicle instanceof Car : FALSE输出行表明instanceof运算符不会判断对象是否是其子类的实例。

另一种方法是用来getClass().equals(Foo.class)确定一个对象是否是一个类的实例。让我们看看下面的例子-:

class Vehicle {

}

class Car extends Vehicle {

}

public class Research {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();

        if (vehicle.getClass().equals(Vehicle.class)) {
            System.out.println("vehicle instanceof Vehicle : TRUE");
        } else {
            System.out.println("vehicle instanceof Vehicle : FALSE");
        }

        if (vehicle.getClass().equals(Car.class)) {
            System.out.println("vehicle instanceof Car : TRUE");
        } else {
            System.out.println("vehicle instanceof Car : FALSE");
        }

        System.out.println();
        Car car = new Car();

        if (car.getClass().equals(Vehicle.class)) {
            System.out.println("car instanceof Vehicle : TRUE");
        } else {
            System.out.println("car instanceof Vehicle : FALSE");
        }

        if (car.getClass().equals(Car.class)) {
            System.out.println("car instanceof Car : TRUE");
        } else {
            System.out.println("car instanceof Car : FALSE");
        }


    }
}

输出-:

vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE

car instanceof Vehicle : FALSE
car instanceof Car : TRUE

描述-:从上面的示例中可以清楚地看出,应该在哪里选择哪一个(以上两个)?

重要笔记-:

  1. instanceofNullPointerException如果引用变量未指向任何对象(即其具有空引用),则运算符不会抛出异常。
  2. car.getClass().equals(Car.class)NullPointerException如果car没有指向任何对象(即它具有空引用),将抛出异常。因此,必须对此进行额外的空检查,例如car != null && car.getClass().equals(Car.class)以防止NullPointerException.
  3. instanceof运算符告诉对象是类的实例还是它的父类(直到任何级别)。
  4. car.getClass().equals(Car.class)将判断一个对象是否只是类的一个实例。(根本不考虑父类和子类)
于 2017-02-15T09:14:37.467 回答
1
    package com.instance;

    public class Foo {
        public void instance(Foo f) {
            System.out.println("---------");
            System.out.println(f.getClass());
            System.out.println(getClass());
            if (f.getClass() == getClass()) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }


package com.instance;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Foo f1 = new Foo();
        Foo f2 = new Foo();
        Foo f3 = new Bar();
        f1.instance(f1);
        f1.instance(f2);
        f1.instance(f3);
    }

}
于 2013-05-22T10:00:19.380 回答
0

好吧,您已经知道 qux 是 instanceof Foo (除非它是 null...),因此qux instanceof Bar您只需要一个简单的 null 检查即可。

于 2013-05-22T09:54:15.207 回答