1. 程式人生 > 其它 >java 基礎(泛型 萬用字元)

java 基礎(泛型 萬用字元)

<?>

允許所有泛型的引用呼叫

萬用字元指定上限

上限 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());

    }
}