我想检查对象o是C类的示例还是C子类的示例。例如,如果x是Point类,我希望x.instanceOf(Point.class)是true,并且x.instanceOf(Object.class)是true。我希望它也能对装箱的原语类型起作用。例如,如果x是Integer,那么x.instanceOf(Integer.class)应该是true。有这样的东西吗?如果没有,我怎么能实现这样的方法呢?
o
C
x
Point
x.instanceOf(Point.class)
true
x.instanceOf(Object.class)
Integer
x.instanceOf(Integer.class)
6gpjuf901#
isInstance做你想做的事情。
if (Point.class.isInstance(someObj)){ ... }
当然,如果可以使用instanceof,就不应该使用它,但是对于反射场景,它经常派上用场。
instanceof
y0u0uwnf2#
我想检查对象o是类c的示例还是c的子类的示例。例如,如果p属于类Point,我想x.instanceOf(Point.class)嗯......什么?O,P和X是什么?我希望它也能用于基元类型,例如,如果x是一个整数,那么x.instanceOf(Integer.class)和x.instanceOf(Object.class)都应该为真。不,它甚至不应该编译。原语不是对象,你不能在它们上面调用方法。无论如何,有三件事,其中之一绝对可以达到你想要的(他们在哪里确切的应用有些不同:
lmvvr0a83#
x instanceof Integer x instanceof Object
你只需要使用正确的语法对于基本类型,你必须做完全不同的事情。2因为你不能为它们创建方法,你需要一个类来保存这个方法。3所以你必须调用“MyClassComparer.instanceOf(x,Integer.Class)”或类似的东西,而不是“x.instanceOf(Integer.Class)"。4这可以通过重载方法来实现,但是我看不出有什么情况需要这个功能。
knpiaxh14#
事实上在Java中有一个布尔运算符,叫做instanceof,它可以用来判断一个对象是一个类的示例,一个子类的示例,还是一个实现特定接口的类的示例。
if(obj instanceof SomeClass) { // Do something }
Java教程中包含此运算符的good example
ut6juiuv5#
Class.isAssignableFrom()的右边是子类因此,对于对象obj和超类Class<?> superClssuperCls.isAssignableFrom( obj.getClass() )以及obj instanceof superCls是等效的。
Class.isAssignableFrom()
obj
Class<?> superCls
superCls.isAssignableFrom( obj.getClass() )
obj instanceof superCls
kknvjkwl6#
您可以:
if (foo instanceof classNameYouWantToCheck)
tag5nh1u7#
“我希望它也适用于基元类型。例如,如果x是一个整数,那么x.instanceOf(Integer.class)和x.instanceOf(Object.class)都应该为真。”为什么?基元类型和引用类型是完全分开的。基元int既不是Integer的子类型,也不是Object的子类型。基元值的类型在编译时总是静态已知的,所以测试它的类型是没有意义的。当然,你可以将基元值装箱,然后测试它的类型:
(Integer)5 instanceof Integer
但这有什么意义呢?
pprl5pva8#
我想您对原始对象和泛型对象的instanceof有些困惑
obj instanceof Class obj instanceof Class<?> // this is the one you want
8条答案
按热度按时间6gpjuf901#
isInstance做你想做的事情。
当然,如果可以使用
instanceof
,就不应该使用它,但是对于反射场景,它经常派上用场。y0u0uwnf2#
我想检查对象o是类c的示例还是c的子类的示例。例如,如果p属于类Point,我想x.instanceOf(Point.class)
嗯......什么?O,P和X是什么?
我希望它也能用于基元类型,例如,如果x是一个整数,那么x.instanceOf(Integer.class)和x.instanceOf(Object.class)都应该为真。
不,它甚至不应该编译。原语不是对象,你不能在它们上面调用方法。
无论如何,有三件事,其中之一绝对可以达到你想要的(他们在哪里确切的应用有些不同:
instanceof
运算符(如果您在编译时知道该类)。lmvvr0a83#
你只需要使用正确的语法
对于基本类型,你必须做完全不同的事情。2因为你不能为它们创建方法,你需要一个类来保存这个方法。3所以你必须调用“MyClassComparer.instanceOf(x,Integer.Class)”或类似的东西,而不是“x.instanceOf(Integer.Class)"。4这可以通过重载方法来实现,但是我看不出有什么情况需要这个功能。
knpiaxh14#
事实上在Java中有一个布尔运算符,叫做instanceof,它可以用来判断一个对象是一个类的示例,一个子类的示例,还是一个实现特定接口的类的示例。
Java教程中包含此运算符的good example
ut6juiuv5#
Class.isAssignableFrom()
的右边是子类因此,对于对象
obj
和超类Class<?> superCls
superCls.isAssignableFrom( obj.getClass() )
以及
obj instanceof superCls
是等效的。
kknvjkwl6#
您可以:
tag5nh1u7#
“我希望它也适用于基元类型。例如,如果x是一个整数,那么x.instanceOf(Integer.class)和x.instanceOf(Object.class)都应该为真。”
为什么?基元类型和引用类型是完全分开的。基元int既不是Integer的子类型,也不是Object的子类型。基元值的类型在编译时总是静态已知的,所以测试它的类型是没有意义的。当然,你可以将基元值装箱,然后测试它的类型:
但这有什么意义呢?
pprl5pva8#
我想您对原始对象和泛型对象的instanceof有些困惑