在检查当前类的实例时,为什么“x instanceof getClass()”不起作用?

时间:2014-06-03 20:16:49

标签: java inheritance instanceof

我有一个抽象类AssociativeFunction,它扩展了Expr。有不同的函数是AssociativeFunction的子类,还有其他表达式是Expr的子类,但不是AssociativeFunction。

在AssociativeFunction类的方法中,我需要检查Expr对象是否是当前类或其子类之一的实例,

即。 Product(扩展了AssociativeFunction)并继承了这个方法;因此,对于所有Product对象和所有CrossProduct(extends Product)对象,检查应返回true,但对于所有Sum(扩展AssociativeFunction)和Number(扩展Expr)对象,则返回false。

  1. 为什么以下不起作用?如何使用instanceof运算符使其工作?如果我不能,为什么不呢?

    if (newArgs.get(i) instanceof getClass()) {
    

    Eclipse产生错误:

      

    令牌“instanceof”,== expected)

    上的语法错误
  2. 这段代码似乎有效,是不是正确?为什么它与(1)不同?

    if (getClass().isInstance(newArgs.get(i))) {
    

2 个答案:

答案 0 :(得分:9)

  

为什么以下不起作用?

因为instanceof在编译时需要类型名称作为第二个操作数,所以基本上。您无法使用instanceof运算符。

production for the instanceof operator是:

  

RelationalExpression instanceof ReferenceType

其中ReferenceType ClassOrInterfaceType TypeVariable ArrayType ...换句话说,类型名称而不是表达式,其值为Class<?>引用。你正在做的有点像试图声明一个类型为&#34;当前类&#34;的变量。 - 这种语言并没有这样定义。

  

这段代码似乎有用,这是正确的吗?

  

为什么它与(1)不同?

因为它使用的是Class.isInstance 方法,而不是instanceof 运算符。他们只是不同的东西。 isInstance方法实际上是一个更动态的版本。

答案 1 :(得分:3)

此方法是Java语言instanceof运算符的动态等价物。

我认为isInstance()主要用于在运行时处理类型反射的代码。特别是,我会说它可以处理你可能事先不知道要提前检查其成员资格的类的类型(尽管这些情况可能很少见)。

例如,您可以使用它来编写一个方法来检查两个任意类型的对象是否与赋值兼容,如:

public boolean areObjectsAssignable(Object left, Object right) {
      return left.getClass().isInstance(right);
} 

一般情况下,我会说,只要您知道要提前检查的课程类型,就应该首选使用instanceof。在那些非常罕见的情况下,请使用isInstance()代替。希望这有帮助!