泛型与数组
泛型与数组
泛型数组的创建
- 可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象
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));
}
}
/**
* 运行结果:
* [苹果, 西瓜, 香蕉]
* 西瓜
*/