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

时间:2009-06-04 08:53:56

标签: java reflection instanceof

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

例如,如果p属于Point类,我希望x.instanceOf(Point.class)truex.instanceOf(Object.class)true。< / p>

我希望它也适用于盒装基元类型。例如,如果xInteger,则x.instanceOf(Integer.class)应为true

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

8 个答案:

答案 0 :(得分:157)

Class.isInstance做你想做的事。

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

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

答案 1 :(得分:19)

  

我想检查一个对象是否是一个   c类或a类的实例   c的子类。例如,如果p是   我想要的课程   x.instanceOf(Point.class)

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

  

我希望它也适用于原始的   类型。例如,如果x是   整数然后   x.instanceOf(Integer.class)也是   x.instanceOf(Object.class)应该是   真。

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

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

  • instanceof运算符,如果您在编译时知道该类。
  • Class.isInstance()如果要根据编译时未知的类检查对象的类。
  • Class.isAssignableFrom()如果要检查给定两个类对象的可赋值性。

答案 2 :(得分:8)

x instanceof Integer
x instanceof Object

你必须使用正确的语法

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

答案 3 :(得分:4)

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

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

Java Tutorial有一个good example此运算符

答案 4 :(得分:0)

你可以这样做:

if (foo instanceof classNameYouWantToCheck) 

答案 5 :(得分:0)

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

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

(Integer)5 instanceof Integer

但那又有什么意义呢?

答案 6 :(得分:0)

Class.isAssignableFrom() 的右边是子类

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

superCls.isAssignableFrom( obj.getClass() )

obj instanceof superCls)

是等价的。

答案 7 :(得分:-2)

我认为你对rawof对象和普通对象感到困惑

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