Java 在检查当前类的实例时,为什么';";getClass()的x实例;工作

Java 在检查当前类的实例时,为什么';";getClass()的x实例;工作,java,inheritance,instanceof,Java,Inheritance,Instanceof,我有一个抽象类AssociateFunction,它扩展了Expr。有不同的函数是AssociationFunction的子类,还有其他表达式是Expr的子类,但不是AssociationFunction 在AssociationFunction类中的方法中,我需要检查Expr对象是否是当前类或其子类的实例 i、 e.产品(扩展AssociateFunction)并继承此方法;因此,对于所有产品对象和所有交叉产品(扩展产品)对象,检查应返回true,但对于所有Sum(扩展关联函数)和Number

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

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

i、 e.产品(扩展AssociateFunction)并继承此方法;因此,对于所有产品对象和所有交叉产品(扩展产品)对象,检查应返回true,但对于所有Sum(扩展关联函数)和Number(扩展扩展扩展)对象,检查应返回false

  • 为什么下面的方法不起作用?如何使用
    instanceof
    操作符使其工作?如果我不能,为什么不呢

    if (newArgs.get(i) instanceof getClass()) {
    
    Eclipse会产生以下错误:

    令牌“instanceof”上的语法错误,==应为)

  • 这个代码似乎有效,对吗?为什么它与(1)不同

  • 为什么下面的方法不起作用

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

    最重要的是:

    关系表达式
    instanceof
    ReferenceType

    其中是ClassOrInterfaceType、TypeVariable或ArrayType。。。换句话说,一个类型名而不是一个表达式,它的计算结果是一个
    引用。你所做的有点像是试图声明一个类型为“当前类”的变量——语言并不是这样定义的

    这个代码似乎有效,对吗

    为什么它与(1)不同


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

    此方法是Java语言instanceof操作符的动态等价物

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

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

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

    一般来说,我会说,只要您事先知道要检查的类的类型,就应该首选使用instanceof。在极少数情况下,如果您不这样做,请改用isInstance()。希望这有帮助

    你查过
    关键字instanceof
    的工作原理了吗?你查过
    类的javadoc吗#isInstance()
    public boolean areObjectsAssignable(Object left, Object right) {
          return left.getClass().isInstance(right);
    }