通配符

简介: 通配符

总结于尚硅谷学习视频

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 {
}
相关文章
|
8月前
|
算法 测试技术 C++
C++算法 通配符匹配
C++算法 通配符匹配
|
9月前
正则中的[^]与通配符里面的[!]的区别
正则中的[^]与通配符里面的[!]的区别
通配符?,*,**区别
通配符?,*,**区别
124 0
|
12月前
|
算法 安全 Swift
LeetCode - #44 通配符匹配
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #44 通配符匹配
使用通配符的技巧
使用通配符的技巧
58 0
|
关系型数据库 MySQL
百分号(%)通配符
百分号(%)通配符
154 0
|
SQL
下划线(_)通配符
下划线(_)通配符
288 0
通配符注意事项
通配符注意事项
56 0
|
存储 缓存
html+css实战50-通配符
html+css实战50-通配符
217 0
html+css实战50-通配符