標籤:system 編譯器 void ber 理解 數組 標識符 傳回值 lis
Java 泛型
Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時間型別安全檢測機制,該機制允許程式員在編譯時間檢測到非法的類型。
泛型的本質是參數化型別,也就是說所操作的資料類型被指定為一個參數。
泛型方法
你可以寫一個泛型方法,該方法在調用時可以接收不同類型的參數。根據傳遞給泛型方法的參數類型,編譯器適當地處理每一個方法調用。
下面是定義泛型方法的規則:
- 所有泛型方法聲明都有一個型別參數聲明部分(由角括弧分隔),該型別參數聲明部分在方法傳回型別之前(在下面例子中的<E>)。
- 每一個型別參數聲明部分包含一個或多個型別參數,參數間用逗號隔開。一個泛型參數,也被稱為一個類型變數,是用於指定一個泛型型別名稱的標識符。
- 型別參數能被用來聲明傳回值類型,並且能作為泛型方法得到的實際參數類型的預留位置。
- 泛型方法體的聲明和其他方法一樣。注意型別參數只能代表引用型類型,不能是原始類型(像int,double,char的等)。
執行個體:
public class ElementDemo { public static void main(String[] args) { //<Integer>運行時類型 //使用泛型後,如果執行個體化是定義的類型與對象傳入的類型不一致,就會在編譯時間期報錯。 Test<Integer> t1 = new Test<>(); t1.add(666); Test<String> t2 = new Test<>(); t2.add("cjj"); }}/** * "E" 在這裡並沒有實際意義,你也可以用別的字母代替 * 它的作用就是在執行個體化Test類的時候,傳入什麼類型它就調用什麼類型 */class Test<E>{ public void add(E e) { System.out.println(e); }}注意:
泛型的命名只要符合標識符的命名規則即可
習慣上泛型一般只使用一個大寫字母進行命名
<T> type
<E> element 元素類型
<K> key
<V> value
<R> result/return
泛型向下相容
<? extends 類/介面>
import java.util.ArrayList;import java.util.List;public class ElementDemo { public static void main(String[] args) { //執行個體化一個Integer類型的數組列表對象,裡面儲存的資料都是int型資料 List<Integer> in = new ArrayList<>(); in.add(1); in.add(2); in.add(3); in.add(4); in.add(5); in.add(6); //執行個體化一個Double類型的數組列表對象,裡面儲存的資料都是Double類型的 List<Double> dos = new ArrayList<>(); dos.add(3.6); dos.add(4.2); dos.add(6.8); dos.add(7.7); dos.add(0.2); //調用方法 print(in); print(dos); } // 寫一個新的方法來遍曆元素類型是數位列表 // 元素類型是Number或者是其子類 // ? extends 類/介面 表示傳入這個類/介面或者是其子類/子介面對象 // 所能傳入的元素的最大類型限定為Number // 規定了泛型的上限 public static void print(List<? extends Number> list) { //在方法體裡面不能再往對象裡添加元素,null除外 list.add(null); //列印對象裡面的元素 System.out.println(list); }}
向上造型規定了泛型的上限,上限的子類都可以向泛型方法傳入對象。
泛型向下相容
<? extends 類/介面>
import java.util.ArrayList;import java.util.List;public class ElementDemo1 { public static void main(String[] args) { List<String> str = new ArrayList<>(); str.add(0, "cjj"); print(str); } // 泛型的下限 // 傳入元素類型是String及其父類的列表 // ? super 類/介面 表示傳入這個類/介面及其父類/父介面的對象 // 表示傳入的最小類型是String public static void print(List<? super String> list) { //方法體裡面可以添加元素 list.add("add"); for(Object o : list){ System.out.println(o); } }}
向上造型規定了泛型的下限,下限的fu類都可以向泛型方法傳入對象。
Java 理解泛型的基本含義