package com.model.fanxing;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
/**
* @Description:测试类
* @Author: 张紫韩
* @Crete 2021/7/1 17:55
* 泛型与数组
* 泛型与反射
*/
public class FanXingDemo11 {
public static <T> void main(String[] args) {
/**
* 1.可以声明代泛型的数组对象,但是不能直接创建带泛型的数组对象
* 2.可以通过java.lang.reflect.Array 的newInstance(Class<T> ,int) 创建T[]数组
* */
//1.
//可以声明带泛型的数组对象,但是不能直接new 创建带泛型的数组对象,(数组和泛型时相冲突)
// ArrayList<String>[] list=new ArrayList<String>[5];
ArrayList<T>[] arrayLists=new ArrayList[5]; //声明泛型的引用,创建不带泛型的数组对象,泛型引用指向这个对象就可以了
ArrayList<String> list1 = new ArrayList<>(); //传概念
ArrayList<Integer> list2 = new ArrayList<>();
list1.add("a");
list2.add(100);
arrayLists[0]= (ArrayList<T>) list1;
arrayLists[1]= (ArrayList<T>) list2;
System.out.println(arrayLists[0]+"\t"+arrayLists[1]);
System.out.println("----------------------------");
ArrayList<String>[] lists=new ArrayList[5]; //要直接创建不带放行的数组对象
ArrayList<String> list = new ArrayList<>(); //传概念
list.add("张紫韩");
lists[0]=list;
// lists[1]=list2; :声明的String类型的数组,不能添加Integer类型的元素
System.out.println(lists[0].get(0));
//2.通过Array.newInstance(tClass, length); 创建泛型类的数组
System.out.println("---------------------------");
Fruit<String> strFruit = new Fruit<>(String.class,5);
strFruit.put(0, "张紫韩0");
strFruit.put(1, "张紫韩1");
strFruit.put(2, "张紫韩2");
String[] arr = strFruit.getArr();
System.out.println(Arrays.deepToString(arr));
for (String s:arr){
System.out.println(s);
}
}
}
class Fruit<T>{
// private T[] arr=new T[5]; :错误 T是不确定的数据类型,而数组编译时需要数据类型。相冲突所以不能创建成功
// Class<T> tClass : T类型的Class类对象
private T[] arr;
public Fruit(Class<T> tClass,int length) {
this.arr = (T[]) Array.newInstance(tClass, length);
}
public void put(int index,T item){
arr[index]=item;
}
public T get(int index){
return arr[index];
}
public T[] getArr(){
return arr;
}
}