泛型的继承和泛型的通配符
package com.atguigu.java2;
import org.junit.Test;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
*
* 1. 泛型在继承方面的体现
*
*
* 2. 通配符的使用
*
* @author liangqichen
* @create 2021-10-09 20:33
*/
public class GenericTest {
/*
1. 泛型在继承方面的体现
虽然:类A是类B的父类, 但是:G<A>和G<B> 不具备子父类关系,二者是并列关系。
补充:类A是类B的父类,A<G> 是 B<G> 的父类
*/
@Test
public void test1(){
Object obj = null;
String str = null;
obj = str;
Object[] arr1 = null;
String[] arr2 = null;
arr1 = arr2;
List<Object> list1 = null;
List<String> list2 = null;
// 以下,编译不通过
// 此时的list1和list2的类型不具有子父类的关系
// list1 = list2;
// Date date = new Date();
// str = date;
/*
反证法:
假设list2可以赋值给list1;
list1.add(123);导致混入非String的数据,出错。
*/
show(list1);
show1(list2);
}
public void show(List<Object> list){
}
public void show1(List<String> list){
}
@Test
public void test2(){
AbstractList<String> list1 = null;
AbstractList<String> list2 = null;
ArrayList<String> list3 = null;
list1 = list3;
list2 = list3;
List<String> list4 = new ArrayList<>();
}
/*
2. 通配符的使用
通配符?
类A是类B的父类 G<A> G<B>是没有关系的 ,二者共同的父类是G<?>
*/
@Test
public void test3(){
List<Object> list1 = null;
List<String> list2 = null;
List<?> list = null;
list = list1;
list = list2;
// print(list1);
// print(list2);
//
List<String> list3 = new ArrayList<>();
list3.add("AA");
list3.add("BB");
list3.add("CC");
list = list3;
// 添加:对于List<?> 就不能向其内部添加数据。
//****除了添加null之外****
// list.add("DD");
// list.add(?);
list.add(null);
// 获取:读取 允许读取数据,读取的数据类型为Object
Object o = list.get(0);
System.out.println(o);
}
public void print(List<?> list){
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
}
/*
3. 有限制条件的通配符的使用
*/
}