java 用泛型参数类型构造数组详解及实例
Java 用泛型参数类型构造数组详解及实例
在 Java 中,我们可以使用泛型来创建具有不同类型的集合。但有时候,我们需要创建一个数组,每个元素的类型都不一样,这时候,我们可以使用泛型来创建一个具有不同类型的数组。
泛型数组概述
Java 中是不允许直接使用泛型类型实例化数组,例如下面的代码会报错:
List<Integer>[] arr = new List<Integer>[10]; // compile error
对此,Java 提供了两种解决方法:
创建一个未指定类型的数组
第一种解决方法是创建一个未指定类型的数组,例如下面的示例代码:
List[] arr = new List[10];
这里创建了一个具有类型 List[] 的数组,在数组声明时没有指定具体的类型参数。虽然这样做可以通过编译,但是数组中的元素没有指定类型参数,我们仍然无法使用具体的类型来操作数组。
对于需要类型指定数组元素的场景,使用强制类型转换
第二种解决方法是使用强制类型转换来将对象转换为特定类型,例如下面的示例代码:
List<Integer>[] arr = (List<Integer>[])new List[10];
这里创建了一个具有类型 List<Integer>[] 的数组,并使用了强制类型转换来将未指定类型的数组转换为了具有类型参数 Integer 的 List 数组。
示例
创建具有不同类型元素的数组
下面的示例代码展示了如何创建一个具有不同类型元素的数组:
class TestGenericArray {
    public static void main(String[] args) {
        // 定义一个 Animal 数组
        Animal[] arr = new Animal[2];
        // 创建 Dog 对象
        Dog dog = new Dog("旺财");
        // 把 Dog 对象添加到数组中
        arr[0] = dog;
        // 创建 Cat 对象
        Cat cat = new Cat("小花");
        // 把 Cat 对象添加到数组中
        arr[1] = cat;
        // 遍历数组,输出数组中的元素
        for (Animal animal : arr) {
            System.out.println(animal.getName());
        }
    }
}
class Animal {
    private String name;
    public Animal(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
}
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
}
在上面的示例代码中,我们定义了一个 Animal 类型的数组,然后将其中一个元素设置为 Dog 对象,将另一个元素设置为 Cat 对象,最后遍历数组并输出所有元素的名称。
创建具有不同类型的 List 数组
下面的示例代码展示了如何创建具有不同类型的 List 数组:
class TestGenericArray {
    public static void main(String[] args) {
        // 创建 Integer 类型的 List 对象
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        // 创建 String 类型的 List 对象
        List<String> list2 = new ArrayList<>();
        list2.add("hello");
        list2.add("world");
        // 创建 List 数组并初始化
        List[] arr = new List[]{list1, list2};
        // 遍历数组,输出数组中每个 List 的元素
        for (List list : arr) {
            System.out.println(list);
        }
    }
}
在上面的示例代码中,我们创建了包含 Integer 和 String 类型元素的 List,然后创建了一个具有不同类型的 List 数组,最后遍历数组并输出所有元素。
