ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java 基础(通配符)

2021-11-29 16:36:20  阅读:217  来源: 互联网

标签:java list1 List 通配符 list3 list2 list 基础 null


<?>

允许所有泛型的引用调用

通配符指定上限

上限 extends: 使用时指定的类型必须是继承某个类,或者实现某个接口,即<=

通配符指定下限

下限 super: 使用时指定的类型不能小于操作的类,即 >=

Person.java

package com.klvchen.java2;

public class Person {
}

Student.java

package com.klvchen.java2;

public class Student extends Person{
}

GenericTest.java

package com.klvchen.java2;

import org.junit.Test;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GenericTest {
    /*
    1. 泛型在继承方面的体现

    类A是类B的父类,G<A>和G<B>二者不具备子父类关系,二者是并列关系。

     */

    @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;

        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(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<Student>();
        List<Person> list4 = new ArrayList<Person>();
        List<Object> list5 = new ArrayList<Object>();

        list1 = list3;
        list1 = list4;
        //list1 = list5;

        //list2 = list3;
        list2 = list4;
        list2 = list5;

        //读取数据
        list1 = list3;
        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());

    }
}

 

标签:java,list1,List,通配符,list3,list2,list,基础,null
来源: https://www.cnblogs.com/gentlescholar/p/15620024.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有