通配符

简介: 通配符

总结于尚硅谷学习视频

GenericTest 类

package com.day0310_1;
import org.junit.jupiter.api.Test;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 *
 * 1.泛型在继承方面的体现
 *  类A是类B的父类,G<A>和G<B>二者不具备子父类关系,二者是并列关系。
 *  补充:类A是类B的父类,A<G> 是 B<G>的父类
 *
 * 2.通配符的使用
 *
 *
 */
public class GenericTest {
    /*
     1.泛型在继承方面的体现
     */
    @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的类型不具备子父类关系
//        Incompatible types
//        list1=list2;
        /*
         假设list1=list2
         list1.add(123);导致混入非String的数据,出错。
        */
        show(list1);
        show1(list2);
    }
    public void show1(List<String> list){
    }
    public void show(List<Object> list){
    }
    @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);
    }
    public void print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }
    }
    /*
    3.有限制条件的通配符的使用
        ? extends A:
            G<? extends A> 可以作为G<A> 和G<B>的父类,其中B是A的子类
        ? super A:
            G<? extends A> 可以作为G<A> 和G<B>的父类,其中B是A的父类
     */
    @Test
    public void test4(){
        List <? extends Person> list1=null;
        List <? super Person> list2=null;
        List<Student> list3=new ArrayList<>();
        List<Person> list4=new ArrayList<>();
        List<Object> list5=new ArrayList<>();
        list1=list3;
        list1=list4;
//        list1=list5;
//        list2=list3;
        list2=list4;
        list2=list5;
        //读取数据:
        list1 =list4;
        Person p = list1.get(0);
        //编译不通过
//        Student s = list1.get(0);
        list2=list4;
        Object obj = list2.get(0);
//        Person obj = list2.get(0);
        //写入数据:
        //编译不通过
//        list1.add(new Student());
        //编译通过
        list2.add(new Person());
        list2.add(new Student());
    }
}

Person类

package com.day0310_1;
public class Person {
}

Student 类

package com.day0310_1;
public class Student extends Person {
}
目录
打赏
0
0
0
0
25
分享
相关文章
|
10月前
常用正则表达式 (必备)
常用正则表达式 (必备)
255 0
一些用到过的正则表达式
1、去除xml或者类似文件的头部信息string text = File.ReadAllText("E:\\AA.xml").Replace("\r\n",""); text = Regex.Replace(text, @"&lt;!-- *.* --&gt;","", RegexOptions.IgnoreCase); 功能:        将AA.xml文件中的回车、换行替换为“”,将
1129 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等