package java4;

import com.sun.org.apache.xpath.internal.operations.NotEquals;
import java1.Person;
import org.junit.Test;

import java.util.*;

/**
 *
 * 1.泛型在继承方面的体现
 *
 *
 * 2.通配符的使用
 * @author 冀帅
 * @date 2020/8/14-16:24
 */
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;//编译错误
    }
    @Test
    public  void test2(){
        AbstractList<String> list1 = null;
        List<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);//AA

  }
  public  void  print(List<?> list){
      Iterator<?> iterator = list.iterator();
      while (iterator.hasNext()){
          System.out.println(iterator.next());

      }
  }
}