带有类名的Java instanceof

时间:2012-12-14 06:42:40

标签: java class instanceof

我很好奇地问这个问题,也许这是毫无意义的。

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

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

为什么我们不能使用如下:

if (a instanceof Parent.class){
}

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

6 个答案:

答案 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.classClass实例,所以即使编译了第二个示例(它没有,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
}