93

我想检查一个对象o是该类的实例C还是C.

例如,如果pPoint我想x.instanceOf(Point.class)成为的类true,也x.instanceOf(Object.class)成为true

我希望它也适用于盒装原始类型。例如, if xis an Integerthen x.instanceOf(Integer.class)should be true

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

4

8 回答 8

182

Class.isInstance做你想做的事。

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

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

于 2009-06-04T09:05:59.967 回答
21

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

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

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

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

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

  • instanceof如果您在编译时知道该类,则该运算符。
  • Class.isInstance()如果您想根据编译时未知的类检查对象的类。
  • Class.isAssignableFrom()如果要检查给定两个类对象的可分配性。
于 2009-06-04T09:03:56.913 回答
9
x instanceof Integer
x instanceof Object

你只需要使用正确的语法

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

于 2009-06-04T08:56:44.290 回答
4

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

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

Java 教程有一个很好的例子来说明这个操作符

于 2009-06-04T08:58:01.807 回答
1

的右侧Class.isAssignableFrom()是子类

所以,对于对象obj和超类Class<?> superCls

superCls.isAssignableFrom( obj.getClass() )

obj instanceof superCls

是等价的。

于 2021-01-10T11:52:43.073 回答
0

你可以做:

if (foo instanceof classNameYouWantToCheck) 
于 2009-06-04T08:57:15.520 回答
0

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

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

(Integer)5 instanceof Integer

但有什么意义呢?

于 2009-06-04T17:00:56.570 回答
-2

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

obj instanceof Class
obj instanceof Class<?> // this is the one you want
于 2013-12-04T00:06:55.583 回答