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

Add*_*dev 39 java instanceof

对于这个例子:

public class Foo{}

public class Bar extends Foo{}

....

void myMethod(Foo qux){
   if (checkInstance(qux,Foo.class)){
     ....
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

instanceof这张支票有什么样的陈述吗?或者我应该使用qux.getClass().equals(Foo.class)

Dun*_*nes 53

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

但是,OO设计的目标是让您以同样的方式对待任何 Foo一个.实例是否是子类在正常程序中应该是无关紧要的.

  • 我认为很多堆栈交换问题都是关于不正常的情况. (17认同)
  • 是的,我很欣赏这个答案,但是你真的需要避免假设OP为什么要问并暗示他们做错了什么。对于这种需求,有很多有效的案例。 (2认同)

小智 6

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


Mar*_*erg 5

你应该使用instanceof

if(qux instanceof Foo && !(qux instanceof Bar)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这不会捕获“Baz”是“Foo”的子类的情况。 (3认同)