检查对象是否是类的实例(但不是其子类的实例)

对于这个例子:

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

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

  • checkInstance(qux,让Foo.class)=真
  • checkInstance(qux,Bar.class)=假

这种检查有像instanceof这样的语句吗? 或者我应该使用qux.getClass().equals(Foo.class)

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

然而,OO设计的目标是允许您以相同的方式对待任何 Foo 。 实例是否是子类在正常程序中应该是无关紧要的。

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

你应该使用instanceof

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

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

我只是尝试下面的代码,似乎工作正常

 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)); } 
  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); } } 

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

 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. 如果引用变量未指向任何对象(即其具有空引用),则instanceof运算符不会抛出NullPointerExceptionexception。
  2. 如果car没有指向任何对象(即它具有空引用), car.getClass().equals(Car.class)将抛出NullPointerExceptionexception。 因此,必须对此进行额外的空检查,例如car != null && car.getClass().equals(Car.class)以防止它出现NullPointerException
  3. instanceof运算符告诉对象是一个类的实例还是它的父类(直到任何级别)。
  4. car.getClass().equals(Car.class)将告诉对象是否只是类的实例。 (根本不考虑父类和子类)

好吧,你已经知道qux是instanceof Foo(除非它是null …),所以你需要的qux instanceof Bar一个简单的qux instanceof Bar和一个null检查。