Java中有类似instanceOf(Class <?> c)的东西吗?

sna*_*ile 83 java reflection instanceof

我想检查对象o是否是类的实例C或子类的实例C.

举例来说,如果p是类的Point我想x.instanceOf(Point.class)truex.instanceOf(Object.class)true.

我希望它也适用于盒装原始类型.例如,如果x是,Integer那么x.instanceOf(Integer.class)应该是true.

有这样的事吗?如果没有,我该如何实现这样的方法?

gus*_*afc 163

Class.isInstance做你想要的.

if (Point.class.isInstance(someObj)){
    ...
}
Run Code Online (Sandbox Code Playgroud)

当然,如果您可以使用它,则不应该使用它instanceof,但对于反射场景,它通常会派上用场.

  • @Ahamed它可能更慢,但更糟糕的是它更难理解!如果有一种非常简单的方法可以做某事 - 比如`if(一个Point的实例)` - 但是你以一种更复杂的方式做到了这一点,那么无论是谁阅读代码都必然会想到"哦,这必须有一个原因正在艰难地完成",然后跳转到文档以了解`Class.isInstance`与`instanceof`的区别.你浪费了同事的时间. (6认同)

Mic*_*rdt 20

我想检查对象o是c类的实例还是c的子类的实例.例如,如果p是Point类,我想要x.instanceOf(Point.class)

嗯什么?什么是o,p和x?

我希望它也适用于原始类型.例如,如果x是整数,则x.instanceOf(Integer.class)和x.instanceOf(Object.class)应为true.

不,它甚至不应该编译.基元不是对象,您不能在它们上调用方法.

无论如何,有三件事,其中一件绝对可以实现你想要的东西(它们在确切的适用范围有所不同:


Eri*_*ler 9

x instanceof Integer
x instanceof Object
Run Code Online (Sandbox Code Playgroud)

你只需要使用正确的语法

对于原始类型,你必须完全不同.由于无法为它们创建方法,因此需要一个保留方法的类.因此,而不是"x.instanceOf(Integer.Class)",你必须调用"MyClassComparer.instanceOf(x,Integer.Class)"或类似的东西.这可以通过重载方法轻松实现,但我没有看到这种功能完全可取的情况.


vic*_*ugo 5

事实上,在Java中有一个名为instanceof的布尔运算符,它可以用来确定一个对象是类的实例、子类的实例还是实现特定接口的类的实例。

if(obj instanceof SomeClass) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

Java 教程有一个关于这个运算符的很好的例子

  • 他将原始类型与对象混淆了。请阅读...“例如,如果 x 是整数,则 x.instanceOf(Integer.class) 和 x.instanceOf(Object.class) 都应该为 true。” 对你对所有答案都投反对票感到羞耻 (5认同)