Java中有没有类似instanceOf(Class〈?>c)的东西?

iovurdzv  于 2023-01-15  发布在  Java
关注(0)|答案(8)|浏览(175)

我想检查对象oC类的示例还是C子类的示例。
例如,如果xPoint类,我希望x.instanceOf(Point.class)true,并且x.instanceOf(Object.class)true
我希望它也能对装箱的原语类型起作用。例如,如果xInteger,那么x.instanceOf(Integer.class)应该是true
有这样的东西吗?如果没有,我怎么能实现这样的方法呢?

6gpjuf90

6gpjuf901#

isInstance做你想做的事情。

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

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

y0u0uwnf

y0u0uwnf2#

我想检查对象o是类c的示例还是c的子类的示例。例如,如果p属于类Point,我想x.instanceOf(Point.class)
嗯......什么?O,P和X是什么?
我希望它也能用于基元类型,例如,如果x是一个整数,那么x.instanceOf(Integer.class)和x.instanceOf(Object.class)都应该为真。
不,它甚至不应该编译。原语不是对象,你不能在它们上面调用方法。
无论如何,有三件事,其中之一绝对可以达到你想要的(他们在哪里确切的应用有些不同:

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

lmvvr0a83#

x instanceof Integer
x instanceof Object

你只需要使用正确的语法
对于基本类型,你必须做完全不同的事情。2因为你不能为它们创建方法,你需要一个类来保存这个方法。3所以你必须调用“MyClassComparer.instanceOf(x,Integer.Class)”或类似的东西,而不是“x.instanceOf(Integer.Class)"。4这可以通过重载方法来实现,但是我看不出有什么情况需要这个功能。

knpiaxh1

knpiaxh14#

事实上在Java中有一个布尔运算符,叫做instanceof,它可以用来判断一个对象是一个类的示例,一个子类的示例,还是一个实现特定接口的类的示例。

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

Java教程中包含此运算符的good example

ut6juiuv

ut6juiuv5#

Class.isAssignableFrom()的右边是子类
因此,对于对象obj和超类Class<?> superCls
superCls.isAssignableFrom( obj.getClass() )
以及
obj instanceof superCls
是等效的。

kknvjkwl

kknvjkwl6#

您可以:

if (foo instanceof classNameYouWantToCheck)
tag5nh1u

tag5nh1u7#

“我希望它也适用于基元类型。例如,如果x是一个整数,那么x.instanceOf(Integer.class)和x.instanceOf(Object.class)都应该为真。”
为什么?基元类型和引用类型是完全分开的。基元int既不是Integer的子类型,也不是Object的子类型。基元值的类型在编译时总是静态已知的,所以测试它的类型是没有意义的。当然,你可以将基元值装箱,然后测试它的类型:

(Integer)5 instanceof Integer

但这有什么意义呢?

pprl5pva

pprl5pva8#

我想您对原始对象和泛型对象的instanceof有些困惑

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

相关问题