泛型与数组
泛型与数组
泛型数组的创建
- 可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象
ArrayList
原因:假如我们可以声明这样一个泛型数组(实际上是不可以的):
List
由于在 Java 中,数组是协变(covariant)的,这意味着基类类型的数组可以接收子类类型的数组,例如:
Object[] objects = stringLists;
一旦我们这样做之后,就可以通过objects向 stringLists中添加非List
随后,再使用 stringList 时,stringList[0] 就会保存 intList, 而使用下面的代码,编译器不会提示错误,但运行时,就会出错。
String str = stringList[0].get(0);
即使创建出来“泛型数组”以上错误也依然存在。
List
Object[] objects = stringLists;
List
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));
    }
}
/**
 * 运行结果:
 * [苹果, 西瓜, 香蕉]
 * 西瓜
 */
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号