標籤:報錯 就會 font scanner IV ring code 泛型 abstract
使用集合時,必須明確集合中元素的類型。這種方式稱為:泛型。
定義格式:修飾符 class 類名<代表泛型的變數> { }
建立對象時 確定泛型的類型
例如,ArrayList<String> list = new ArrayList<String>();
此時,變數E的值就是String類型
class ArrayList<String>{public boolean add(String e){ } public String get(int index){ }}
例如,ArrayList<Integer> list = new ArrayList<Integer>();
此時,變數E的值就是Integer類型
class ArrayList<Integer>{public boolean add(Integer e){ } public Integer get(int index){ }} 含有泛型的方法
定義格式:修飾符 <代表泛型的變數> 傳回值類型 方法名(參數){ }
例如,API中的ArrayList集合中的方法:
public <T> T[] toArray(T[] a){ }
//該方法,用來把集合元素儲存到指定資料類型的數組中,返回已儲存集合元素的數組
使用格式:調用方法時,確定泛型的類型
例如
ArrayList<String> list = new ArrayList<String>();
String[] arr = new String[100];
String[] result = list.toArray(arr);
此時,變數T的值就是String類型。變數T,可以與定義集合的泛型不同
public <String> String[] toArray(String[] a){
例如
ArrayList<String> list = new ArrayList<String>();
Integer[] arr = new Integer[100];
Integer [] result = list.toArray(arr);
此時,變數T的值就是Integer類型。變數T,可以與定義集合的泛型不同
public <Integer> Integer[] toArray(Integer[] a){ }
含有泛型的介面
定義格式:修飾符 interface介面名<代表泛型的變數> { }
例如,API中的Iterator迭代器介面
public interface Iterator<E> {
public abstract E next();
}
使用格式:
定義類時確定泛型的類型
例如
public final class Scanner implements Iterator<String> {
public String next(){ }
}
此時,變數E的值就是String類型。
始終不確定泛型的類型,直到建立對象時,確定泛型的類型
例如
ArrayList<String> list = new ArrayList<String>();
Iterator<String> it = list.iterator();
此時,變數E的值就是String類型。
public interface Iterator<String> {
public abstract String next();
}
使用泛型的好處
將運行時期的ClassCastException,轉移到了編譯時間期變成了編譯失敗。
避免了類型強轉的麻煩。
public class GenericDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("abc"); list.add("itcast"); //list.add(5);//當集合明確類型後,存放類型不一致就會編譯報錯 //集合已經明確具體存放的元素類型,那麼在使用迭代器的時候,迭代器也同樣會知道具體遍曆元素類型 Iterator<String> it = list.iterator(); while(it.hasNext()){ String str = it.next();//當使用Iterator<String>控制元素類型後,就不需要強轉了。擷取到的元素直接就是String類型 System.out.println(str.length()); } }} 泛型萬用字元
泛型是在限定資料類型,當在集合或者其他地方使用到泛型後,那麼這時一旦明確泛型的資料類型,那麼在使用的時候只能給其傳遞和資料類型匹配的類型,否則就會報錯。
當使用泛型類或者介面時,傳遞的資料中,泛型型別不確定,可以通過萬用字元<?>表示。但是一旦使用泛型的萬用字元後,
只能使用Object類中的共性方法,集合中元素自身方法無法使用。
泛型限定
限定泛型的上限:
格式:? extends E
? 代表接收E類型或者E的子類型的元素
例如,泛型限定為:? extends Person
則 ? 代表接收Person類型或者Person子類型的元素
限定泛型的下限:
格式:? super E
? 代表接收E類型或者E的父類型的元素
例如,泛型限定為:? super Student
則 ? 代表接收Student類型或者Student父類型的元素
JAVA-基礎-泛型