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


87

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

例如,如果pis是类,Point我想x.instanceOf(Point.class)成为true并且也要x.instanceOf(Object.class)成为true

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

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


处理盒装课程有点混乱
dfa

Answers:


172

Class.isInstance可以满足您的需求。

if (Point.class.isInstance(someObj)){
    ...
}

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


6
@Ahamed可能会慢一些,但更糟糕的是它很难理解!如果有一种非常简单的方式来执行某项操作(例如)if (a instanceof Point),但是您以一种更加复杂的方式来执行此操作,那么阅读该代码的人必然会想:“哦,必须有一个很难做到这一点的理由”,并且然后跳至文档以找出Class.isInstance与的不同之处instanceof。你浪费同事的时间。
gustafc 2014年

21

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

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

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

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

无论如何,有三件事,其中一项绝对可以实现您想要的(它们在确切的应用位置有所不同:


9
x instanceof Integer
x instanceof Object

您只需要使用正确的语法

对于原始类型,您必须完全不同。由于无法为其创建方法,因此需要一个保留该方法的类。因此,您必须调用“ MyClassComparer.instanceOf(x,Integer.Class)”或类似的名称,而不是“ x.instanceOf(Integer.Class)”。这可以很容易地通过重载方法来实现,但是我看不到那种功能完全可取的情况。


4

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

if(obj instanceof SomeClass) {
    // Do something
}

Java教程对此操作符提供了很好的示例


1
您不能对原始类型使用instanceof
dfa

4
他将原始类型与对象混淆了。请阅读...“例如,如果x是整数,则x.instanceOf(Integer.class)以及x.instanceOf(Object.class)应该为true。” 羞愧于您否决所有答案
Victor Hugo

其次(sp)使用Java教程的建议。对于学习语言本身,它是一个很好的参考。
luis.espinal 2010年

0

你可以做:

if (foo instanceof classNameYouWantToCheck) 

您不能对原始类型使用instanceof
dfa

上课只是为了表明他应该在那里写上班名。我会修复它
fmsf

0

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

为什么?基本类型和引用类型是完全分开的。原始int不是Integer或Object的子类型。基本值的类型在编译时始终是静态已知的,因此测试其类型毫无意义。当然,您可以将原始值装箱,然后测试其类型:

(Integer)5 instanceof Integer

但是有什么意义呢?


-2

我认为您对原始对象和通用对象的instanceof感到困惑

obj instanceof Class
obj instanceof Class<?> // this is the one you want

2
由于类型擦除,您不能在instanceof运算符的右侧使用泛型。
马提亚斯(Matthias)

2
不,是对此感到困惑。您必须在之后使用原始类型instanceof
达伍德·本·卡里姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.