繁体   English   中英

有没有像 instanceOf(Class<?> c) 在 Java 中?

[英]Is there something like instanceOf(Class<?> c) in Java?

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

例如,如果pPoint类,我希望x.instanceOf(Point.class)true并且x.instanceOf(Object.class)true

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

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

Class.isInstance做你想要的。

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

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

我想检查对象 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()如果要检查给定两个类对象的可分配性。
x instanceof Integer
x instanceof Object

你只需要使用正确的语法

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

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

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

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

Class.isAssignableFrom()的右侧是子类

因此,对于对象obj和超类Class<?> superCls

superCls.isAssignableFrom( obj.getClass() )

obj instanceof superCls)

是等价的。

你可以做:

if (foo instanceof classNameYouWantToCheck) 

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

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

(Integer)5 instanceof Integer

但重点是什么?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM