【问题标题】:Using elements of an array with instanceof使用带有 instanceof 的数组元素
【发布时间】:2014-06-30 13:08:28
【问题描述】:

是否可以对两个不同数组中的两个元素使用 instanceof?

例如:if(arrayA[c] instanceof arrayB[c]){}

我已经尝试了上面的代码,但得到以下错误:

error: ']' expected: if(arrayA[c] instanceof arrayB[c]){}
                                                    ^
error: ';' expected: if(arrayA[c] instanceof arrayB[c]){}
                                                     ^
error: illegal start of expression: if(arrayA[c] instanceof arrayB[c]){}
                                                                     ^

【问题讨论】:

  • arrayB[c] 是否包含类?
  • 不,它们包含 Token 的对象。我还有几个扩展 Token 的类,并希望确保数组的内容是同一类的对象。
  • 那么你一定会得到一个编译时错误。您需要在 instanceOf 的 lhs 中添加一个对象,在 RHS 中添加一个类。

标签: java arrays instanceof


【解决方案1】:

您可以使用Class.isAssignableFrom()

来自 javadoc:

确定此 Class 对象表示的类或接口是否 要么是相同的,要么是超类或超接口, 由指定的 Class 参数表示的类或接口。

【讨论】:

    【解决方案2】:

    当你使用instanceof时,你需要在编译时知道“B”的类,所以如果元素包含类名,那么你可以使用它其他NO

    还要补充一点,instanceof 只能用于引用类型,不能用于原始类型

    【讨论】:

    • 一个问题:arrayA被认为是引用类型吗?
    【解决方案3】:

    您可以尝试以下方法:

    Class cA=arrayA[c].getClass();
    Class cB=arrayB[c].getClass();
    if (cA.isAssignableFrom(cB) {
       .... your code Here
    }
    

    这样,您将使用反射 API 动态加载数组内对象的类,并验证 arrayA 中的对象是否是 arrayB 中对象的实例(作为直接实例或子类)。

    【讨论】:

      【解决方案4】:

      你可以使用Class#isInstance:

      if (arrayB[c].getClass().isInstance(arrayA[c])){
          // do something
      }
      

      【讨论】:

        【解决方案5】:

        如果您希望相应的元素具有完全相同的类型,那么以下就足够了。

            if (arrayA[c].getClass() == arrayB[c].getClass()) {}
        

        (请注意,==equals 等价于 Class 对象。)

        如果可以接受子类型,请改用Class.isAssignableFrom(Class) 方法。注意这个方法是不对称的:

        c1.isAssignableFrom(c2) 并不暗示c2.isAssignableFrom(c1)


        是否可以对两个不同数组中的两个元素使用 instanceof?

        没有。 Java 语言不允许这样做。

        instanceof 运算符根据类型测试对象,右手操作数必须是 TypeReference;即类型或类型变量。它不能是普通的变量或表达式;它们在那个位置是语法无效的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-29
          • 2020-11-16
          • 1970-01-01
          • 1970-01-01
          • 2015-03-26
          • 2020-09-27
          相关资源
          最近更新 更多