package com.atguigu.java2;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.junit.Test;
public class GenericTest {
/*
* 有限制条件的通配符
*
* 举例:
* List<? extends Number> 是 List<A> 和 List<Number>的父类。其中:类A是Number的子类
*
* List<? super Number> 是 List<A> 和 List<Number>的父类。其中:类A是Number的父类
*
*/
@Test
public void test3(){
List<Object> list1 = null;
List<Number> list2 = null;
List<Integer> list3 = null;
List<? extends Number> list4 = null;
List<? super Number> list5 = null;
// list4 = list1;
list4 = list2;
list4 = list3;
list5 = list1;
list5 = list2;
// list5 = list3;
}
/* 通配符的使用(掌握)
* ?:通配符
* 比如:List<?> 作为List<A>的父类。 A:任意的一个类型。
*
* 涉及通配符的集合的数据的写入和读取。
* 写入:不允许向使用了通配符的集合类中添加元素。特例:null.
* 读取:可以从使用了通配符的集合类中读取数据。
*/
@Test
public void test2(){
List<?> list1 = null;
List<Object> list2 = null;
List<String> list3 = new ArrayList<>();
list3.add("AA");
list3.add("BB");
list1 = list2;
list1 = list3;
list1.add(null);
System.out.println(list1.size());
method3(list2);
method3(list3);
//1.写入
// list1.add("AA");
list1.add(null);
list3.add("kk");
//2.读取
Object o = list1.get(0);
System.out.println(o);
System.out.println(list1);
list1.remove(3);
System.out.println(list1);
}
public void method3(List<?> list){
}
/*
* 泛型在继承上的体现(掌握)
* 结论1:如果类A是类B的父类,则G<A> 与 G<B> 不满足子父类关系。
* 结论2:如果类A是类B的父类,则A<G> 是 B<G>的父类
*/
@Test
public void test1(){
Object obj = new String("AA");
Object[] arr1 = null;
String[] arr2 = new String[4];
arr1 = arr2;
method1(arr2);
System.out.println("***************");
List<Object> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
// list1 = list2;//编译不通过
/*反证法:
*list1.add(Object obj);
*/
// String s = new Date();
// method2(list2);
method2(list1);
Collection<Object> coll = null;
coll = list1;//编译通过
//coll = list2; 报错
}
public void method2(List<Object> list){
}
public void method1(Object[] arr){//Object[] arr = new String[4];
}
}