java 基礎(泛型 萬用字元)
阿新 • • 發佈:2021-10-16
<?>
允許所有泛型的引用呼叫
萬用字元指定上限
上限 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()); } }