1. 概述

在Java中,经常需要判断一个给定的对象是否为数组。这在处理泛型数组或代码中进行类型检查时非常有用。

本教程将探讨如何实现这种判断。

2. 问题介绍

首先,我们来看两个对象:

final Object ARRAY_INT = new int[] { 1, 2, 3, 4, 5 };
final Object ARRAY_PERSON = new Person[] { new Person("Jackie Chan", "Hong Kong"), new Person("Tom Hanks", "United States") };

我们在 Object 类型下声明了两个对象,它们都是数组。一个是基本类型数组(int[]),另一个是 Person 实例数组(Person[])。Person 是一个简单的POJO类,有两个属性:

class Person {
    private String name;
    private String Location;
                                                                            
    public Person(String name, String location) {
        this.name = name;
        this.Location = location;
    }
                                                                            
    // getter methods are omitted
}

我们需要找到一种方法来确定这两个对象确实是数组。Java提供了简单直接的方式来检查一个对象是否为数组。在这篇教程中,我们将学习两种不同的方法:

  • 使用 instanceof 运算符
  • 使用 Class.isArray() 方法

为了简化,我们将使用单元测试断言来验证每种方法是否能给出预期的结果。

接下来,让我们看看它们是如何工作的。

3. 使用 instanceof 运算符

Java中的 instanceof 运算符用于确定给定对象的类型。其形式为 obj instanceof type,其中 obj 是被检查的对象,type 是正在检查的类型。

由于我们通常希望检查对象是否为数组,所以我们可以使用 Object[] 作为类型。例如,检查 Person 数组的方法按预期工作:

assertTrue(ARRAY_PERSON instanceof Object[]);

然而,在Java中,我们有基本类型数组和对象数组。例如,我们的 ARRAY_INT 是一个基本类型数组。如果我们使用相同的方法检查基本类型数组,它将失败

assertFalse(ARRAY_INT instanceof Object[]);

instanceof 运算符在检查 ARRAY_INT 对象与 int[] 类型时返回 true

assertTrue(ARRAY_INT instanceof int[]);

但是,我们并不知道给定对象的具体类型是 Object[]int[]long[]short[]。因此,对于类型为 Object 的实例 obj,如果我们要使用 instanceof 方法检查它是否为数组,我们需要涵盖对象数组和所有基本类型数组的情况

obj instanceof Object[] || obj instanceof boolean[] ||
obj instanceof byte[] || obj instanceof short[] ||
obj instanceof char[] || obj instanceof int[] ||
obj instanceof long[] || obj instanceof float[] ||
obj instanceof double[]

检查逻辑有点冗长。不过,我们可以把这个检查放在一个方法中:

boolean isArray(Object obj) {
    return obj instanceof Object[] || obj instanceof boolean[] || 
      obj instanceof byte[] || obj instanceof short[] || 
      obj instanceof char[] || obj instanceof int[] || 
      obj instanceof long[] || obj instanceof float[] || 
      obj instanceof double[];
}

然后,我们可以使用我们的 isArray() 方法来检查对象和基本类型数组:

assertTrue(isArray(ARRAY_PERSON));
assertTrue(isArray(ARRAY_INT));

4. 使用 Class.isArray() 方法

我们已经学会了使用 instanceof 运算符来判断给定对象是否为数组。这种方法可以完成任务,但实现看起来冗长,因为我们需要涵盖所有基本类型数组的情况。接下来,让我们看看另一种更紧凑的方法:使用 Class.isArray() 方法。

方法名表明了它的作用。Class.isArray() 方法属于 java.lang.Class 类,如果指定的对象是数组则返回 true,否则返回 false。此外,**Class.isArray() 方法可以处理对象和基本类型数组**:

assertTrue(ARRAY_INT.getClass().isArray());
assertTrue(ARRAY_PERSON.getClass().isArray());

此外,如果我们需要知道数组元素的类型,可以使用 Class.getComponentType() 方法:

assertEquals(Person.class, ARRAY_PERSON.getClass().getComponentType());
assertEquals(int.class, ARRAY_INT.getClass().getComponentType());

一旦我们知道给定对象是数组及其元素的类型,就可以使用 Array.get() 方法获取所需的元素并将其转换为具体的类型:

if (ARRAY_PERSON.getClass().isArray() && ARRAY_PERSON.getClass().getComponentType() == Person.class) {
    Person person = (Person) Array.get(ARRAY_PERSON, 1)
    assertEquals("Tom Hanks", person.getName());
}
if (ARRAY_INT.getClass().isArray() && ARRAY_INT.getClass().getComponentType() == int.class) {
    assertEquals(2, ((int) Array.get(ARRAY_INT, 1)));
}

5. 总结

在这篇文章中,我们学习了两种检查给定对象是否为数组的方法。

我们看到,如果使用 instanceof 运算符,我们必须涵盖对象数组和所有基本类型数组的情况。另一方面,Class.isArray() 方法更为直接,适用于对象和所有基本类型数组。

如往常一样,文章中展示的所有代码片段都可以在GitHub上找到。


« 上一篇: Quarkus Funqy指南
» 下一篇: Java Weekly, 第477期