12

我只是好奇地问这个问题,也许这很没有意义。

当我们在 java 中使用 instanceof 时,例如:

if (a instanceof Parent){ //"Parent" here is a parent class of "a"
}

为什么我们不能像下面这样使用:

if (a instanceof Parent.class){
}

从严格编程的角度来看,第二个“instanceof”是否更有意义?“Parent”和“Parent.class”有什么区别?

4

6 回答 6

19

“Parent”和“Parent.class”有什么区别?

后者是类文字- 一种访问类型对象的方式Class<Parent>

前者只是一个类的名称,它在各种情况下使用——当调用静态方法、构造函数、强制转换等时。

从严格编程的角度来看,第二个“instanceof”是否更有意义?

好吧,不像定义的语言那样 -instanceof 适用于类型的名称,而不是表达式。如果你能写

if (a instanceof Parent.class)

那么我希望你确实能够写:

Class<?> clazz = Parent.class;
if (a instanceof clazz)

...这不是它的工作方式。另一方面,您可以根据需要调用方法Class.isInstance

首先,您所说的“严格编程的观点”是什么意思?

于 2012-12-14T06:47:42.060 回答
1

Parent是一个类,所以第二个例子并不比第一个更有意义。你在问实例是否是类的实例,这a instanceof Parent是一个非常直接的表达。

Parent.class是 的一个实例Class所以即使编译了第二个示例(它没有,右手instanceof本身不能是一个实例),它也不会检查您希望它检查的内容。:-)

于 2012-12-14T06:47:22.933 回答
0

Parent是一种类型的名称。 Parent.class本质上是一个引用对象(特别是 的实例Class)的静态变量。您想问是否a是该Parent类型的一个实例,而不是它是否是一个对象的一个​​实例,该对象本身就是某个其他类型的实例(名为Class)。

于 2012-12-14T06:47:35.463 回答
0

当您编写时Parent.class,这意味着您正在java.lang.Class为 Parent 类创建一个对象。所以if (a instanceof Parent.class){ }这对你不起作用。

有关 Class 类的更多详细信息,请查看以下链接:
Class

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。每个数组还属于一个类,该类反映为一个 Class 对象,该对象由具有相同元素类型和维数的所有数组共享。原始 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

于 2012-12-14T06:47:47.977 回答
0

静态Parent.class成员实际上是一个对象。如果您愿意,可以将其分配给类型Object或类型的变量Class

Object o = Parent.class;
Class c = Parent.class;

Parent另一方面,它不是对象或变量:它是Type Name,根据 Java 规范。

如果你能做到这一点...

a instanceof Parent.class

既然Parent.class是一个对象,那么你也可以这样做:

Cat myCat = new DomesticLonghair();
a instanceof myCat;

......这很愚蠢。

于 2012-12-14T06:48:30.930 回答
0

如上所述,这个问题并不愚蠢!

类之间的子类关系由方法定义 Class<?>.isAssignableFrom()

if (Parent.class.isAssignableFrom(a.getClass()))
{
    // a is instance of Parent or subclass
}
于 2021-03-18T19:49:36.853 回答