我很好奇地问这个问题,也许这是毫无意义的。
当我们在java中使用instanceof时,例如:
if (a instanceof Parent){ //"Parent" here is a parent class of "a"
}
为什么我们不能使用如下:
if (a instanceof Parent.class){
}
从严格编程的角度来看,第二个'instanceof'是否更有意义? “Parent”和“Parent.class”有什么区别?
答案 0 :(得分:16)
“Parent”和“Parent.class”有什么区别?
后者是类文字 - 一种访问Class<Parent>
类型对象的方法。
前者只是一个类的名称,它在各种情况下使用 - 调用静态方法,构造函数,强制转换等。
从严格编程的角度来看第二个'instanceof'是否更有意义?
不是因为定义了语言 - instanceof
只有使用类型名称,从不表达式。如果你可以写
if (a instanceof Parent.class)
然后我期待你能写下来:
Class<?> clazz = Parent.class;
if (a instanceof clazz)
......而这不是它的工作方式。另一方面,是 Class.isInstance
方法,如果需要,可以调用。
首先,“严格编程的观点”是什么意思?
答案 1 :(得分:1)
Parent
是一个类,所以第二个例子对第一个例子没有意义。你问的是实例是否是该类的一个实例,a instanceof Parent
是一个非常直接的表达。
Parent.class
是Class
的实例,所以即使编译了第二个示例(它没有,instanceof
的右侧也可以'这本身就是一个实例),它不会检查你想要检查的内容。 : - )
答案 2 :(得分:0)
Parent
是类型的名称。 Parent.class
本质上是一个静态变量,它引用一个对象(特别是Class
的一个实例)。您想询问a
是否是Parent
类型的实例,而不是它是否是一个对象的实例,它本身就是某个其他类型的实例(名为Class
)。
答案 3 :(得分:0)
当您编写Parent.class
时,这意味着您正在为您的Parent类创建一个java.lang.Class
对象。
所以if (a instanceof Parent.class){
}
这对你不起作用。
有关Class class的更多详细信息,请查看以下链接:
Class
类Class的实例表示正在运行的Java应用程序中的类和接口。每个数组也属于一个类,它反映为一个Class对象,由具有相同元素类型和维数的所有数组共享。原始Java类型(boolean,byte,char,short,int,long,float和double)以及关键字void也表示为Class对象。
答案 4 :(得分:0)
静态Parent.class
成员实际上是一个对象。如果您愿意,可以将其分配给Object
类型的变量或Class
类型的变量:
Object o = Parent.class;
Class c = Parent.class;
另一方面, Parent
不是对象或变量:根据Java规范,它是Type Name。
如果你能做到这一点......
a instanceof Parent.class
由于Parent.class
是对象,因此您可以做到这一点:
Cat myCat = new DomesticLonghair();
a instanceof myCat;
......这真是太傻了。
答案 5 :(得分:0)
这个问题并不愚蠢,如上所述!
类之间的子类关系由方法定义
Class<?>.isAssignableFrom()
if (Parent.class.isAssignableFrom(a.getClass()))
{
// a is instance of Parent or subclass
}