泛型与数组

泛型与数组

泛型数组的创建

  • 可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象

ArrayList[] listArr = new ArrayList<>[5]; //会报错

原因:假如我们可以声明这样一个泛型数组(实际上是不可以的):
List[] stringLists = new List[10];
由于在 Java 中,数组是协变(covariant)的,这意味着基类类型的数组可以接收子类类型的数组,例如:
Object[] objects = stringLists;
一旦我们这样做之后,就可以通过objects向 stringLists中添加非List类型的数据。
随后,再使用 stringList 时,stringList[0] 就会保存 intList, 而使用下面的代码,编译器不会提示错误,但运行时,就会出错。
String str = stringList[0].get(0);

即使创建出来“泛型数组”以上错误也依然存在。

List[] stringLists = (List[])new List[10];
Object[] objects = stringLists;
List intList = Arrays.asList(1);
objects[0] = intList;
String str = stringLists[0].get(0); //runtime error

package com.genericity.demo7;

import java.util.ArrayList;

public class Test1 {
    public static void main(String[] args) {
//        ArrayList<String>[] listArr = new ArrayList<>[5]; //会报错
        //以下这种写法也是会报错的:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
//        ArrayList[] list = new ArrayList[5];
//        ArrayList<String>[] listArr = list;
//
//        ArrayList<Integer> intList = new ArrayList<>();
//        intList.add(100);
//
//        list[0] = intList;
//        String s = listArr[0].get(0);
//        System.out.println(s);

//        那么我们应该怎样使用呢?
        ArrayList<String>[] strArrList = new ArrayList[5];
        //ArrayList<Integer> intList = new ArrayList<>();
        //strArrList[0]=intList;//会编译出错:Incompatible types.
        ArrayList<String> strList = new ArrayList<>();
        strList.add("aaa");
        strArrList[0]=strList;//这样使用才是正确的
        System.out.println(strArrList[0].get(0));
    }
}

  • 可以通过java.lang.reflect.Array的newInstance(Class,int)创建T[]数组
package com.genericity.demo7;

import com.zyqtest.Aa;

import java.lang.reflect.Array;

public class Fruit<T> {
    //申明一个泛型数组
    private T[] array;

    /**
     *
     * @param clz Class对象
     * @param length 数组的长度
     */
    public Fruit(Class<T> clz,int length){
       //通过Array.newInstance创建泛型数组
        array = (T[]) Array.newInstance(clz,length);
    }

    /**
     * 填充数组
     * @param index 数组的下标
     * @param item 元素-值
     */
    public void put(int index,T item){
        array[index]=item;
    }

    /**
     * 获取数组元素
     * @param index
     * @return
     */
    public T get(int index){
        return array[index];
    }

    /**
     * 获取泛型数组
     * @return
     */
    public T[] getArray(){
        return array;
    }

}

package com.genericity.demo7;

import java.util.Arrays;

public class Test2 {
    public static void main(String[] args) {
        Fruit<String> fruit = new Fruit<>(String.class,3);
        fruit.put(0,"苹果");
        fruit.put(1,"西瓜");
        fruit.put(2,"香蕉");
        System.out.println(Arrays.toString(fruit.getArray()));
        System.out.println(fruit.get(1));
    }
}
/**
 * 运行结果:
 * [苹果, 西瓜, 香蕉]
 * 西瓜
 */

原文地址:https://www.cnblogs.com/dongyaotou/p/15662559.html