我只是好奇地问这个问题,也许这很没有意义。
当我们在 java 中使用 instanceof 时,例如:
if (a instanceof Parent){ //"Parent" here is a parent class of "a"
}
为什么我们不能像下面这样使用:
if (a instanceof Parent.class){
}
从严格编程的角度来看,第二个“instanceof”是否更有意义?“Parent”和“Parent.class”有什么区别?
我只是好奇地问这个问题,也许这很没有意义。
当我们在 java 中使用 instanceof 时,例如:
if (a instanceof Parent){ //"Parent" here is a parent class of "a"
}
为什么我们不能像下面这样使用:
if (a instanceof Parent.class){
}
从严格编程的角度来看,第二个“instanceof”是否更有意义?“Parent”和“Parent.class”有什么区别?
“Parent”和“Parent.class”有什么区别?
后者是类文字- 一种访问类型对象的方式Class<Parent>
。
前者只是一个类的名称,它在各种情况下使用——当调用静态方法、构造函数、强制转换等时。
从严格编程的角度来看,第二个“instanceof”是否更有意义?
好吧,不像定义的语言那样 -instanceof
只适用于类型的名称,而不是表达式。如果你能写
if (a instanceof Parent.class)
那么我希望你确实能够写:
Class<?> clazz = Parent.class;
if (a instanceof clazz)
...这不是它的工作方式。另一方面,您可以根据需要调用方法。Class.isInstance
首先,您所说的“严格编程的观点”是什么意思?
Parent
是一个类,所以第二个例子并不比第一个更有意义。你在问实例是否是类的实例,这a instanceof Parent
是一个非常直接的表达。
Parent.class
是 的一个实例,Class
所以即使编译了第二个示例(它没有,右手instanceof
本身不能是一个实例),它也不会检查您希望它检查的内容。:-)
Parent
是一种类型的名称。 Parent.class
本质上是一个引用对象(特别是 的实例Class
)的静态变量。您想问是否a
是该Parent
类型的一个实例,而不是它是否是一个对象的一个实例,该对象本身就是某个其他类型的实例(名为Class
)。
当您编写时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 对象。
静态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;
......这很愚蠢。
如上所述,这个问题并不愚蠢!
类之间的子类关系由方法定义
Class<?>.isAssignableFrom()
if (Parent.class.isAssignableFrom(a.getClass()))
{
// a is instance of Parent or subclass
}