目录
泛型基本介绍
泛型本质:类型参数化(即将参数的类型又进行了参数化)
泛型使用:先声明再使用 声明方法如 <T>
泛型方法:1.实例方法:可以使用类上声明的泛型,也可以使用本方法上声明的泛型
2. 静态方法:只能使用本方法上声明的泛型
泛型的擦除机制
在编译时候会类型检查,真正执行的时候就不管类型了,一律加进去。
//list不加类型限制,可以添加任何类型
ArrayList list = new ArrayList<>();
list.add("name");
list.add(123);
list.add(new User());
System.out.println(list);
//添加了类型限制,只能添加限制的类型
ArrayList<Integer> list = new ArrayList<>();
list.add(23);
list.add("name");
//上面list通过反射可以给其添加任意值
ArrayList<Integer> list = new ArrayList<>();
list.add(23);
Class<? extends ArrayList> clazz = list.getClass();
Method addMethod = clazz.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "name");
System.out.println(list);//name添加了进去
运行结果:
泛型不支持继承
泛型通配符:?
/**
3种通配符如下:
1.?:代表任何类型都可以
2.? extends UserFather:所以继承自UserFather的都可以接收
3.? super User:是User父亲的
*/
@Test
public void test1() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
ArrayList<String> stringArrayList = new ArrayList<>();
ArrayList<Integer> integerArrayList = new ArrayList<>();
//俩个list都可以传入
play(stringArrayList);
play(integerArrayList);
}
public void play(List<?> list){
System.out.println(list);
}
@Test
public void test2() {
ArrayList<UserFather> userFathers = new ArrayList<>();
ArrayList<User> users = new ArrayList<>();
play1(userFathers);
play1(users);
play2(userFathers);
play2(users);
ArrayList<Object> objects = new ArrayList<>();
play1(objects);
}
//List<? super User> :参数是User的父亲
public void play1(List<? super User> list) {
System.out.println(list);
}
//List<? extends UserFather>:参数继承自UserFather
public void play2(List<? extends UserFather> list) {
System.out.println(list);
}
定义泛型类
public class FanXing<T> {
Object[] objects = new Object[12];
int index = 0;
public void add(T t) {
objects[index++] = t;
}
public T get(int index) {
return (T) objects[index];
}
public static void main(String[] args) {
FanXing<String> fanXing = new FanXing<>();
fanXing.add("zhangsan");
fanXing.add("lisi");
System.out.println(fanXing.get(0));//---->zhangsan
System.out.println(fanXing.get(1));//----->lisi
}
}
定义泛型方法
public class FanXing {
Object[] objects = new Object[10];
int index = 0;
public <T> void add(T t) {
objects[index++] = t;
}
public <T> T get(int index) {
return (T) objects[index];
}
public static void main(String[] args) {
FanXing fanXing = new FanXing();
fanXing.add(123);
fanXing.add("123");
fanXing.add(new User());
Object o1 = fanXing.get(0);
System.out.println(o1);
Object o2 = fanXing.get(1);
System.out.println(o2);
Object o3 = fanXing.get(2);
System.out.println(o3);
}
}
运行结果:
定义泛型接口
//接口类
public interface FanXing<T> {
public void add(T t);
public T get(int index);
}
//实现类
public class FanXingImpl implements FanXing<String> {
Object[] objects = new Object[10];
int index = 0;
@Override
public void add(String s) {
}
@Override
public String get(int index) {
return null;
}
}