java泛型類
阿新 • • 發佈:2018-11-06
一、泛型概念簡述
泛型嗎,就是泛泛的型別,指代某一種型別的符號。
這樣有啥好處呢?1.消除強制型別轉換;2.附加型別檢查,避免錯誤型別;3.確保Java型別安全(這才是主要目的)等。相信用過集合框架的都有類似體會。
二、泛型基礎特徵
1)在定義泛型類或宣告泛型類的變數時,使用尖括號來指定形式型別引數。例如java.util.Map介面的定義:
public interface Map<K, V> {
public void put(K key, V value); public V get(K key); }
命名方式約定以大寫的單個字母名稱作為型別引數。
2)泛型不是協變的,即無法向上轉型。不同於Object obj = new String(“str”),以下方式是錯誤的:
錯誤程式碼 即無法向上轉型
List<int> intsList = new ArrayList<int>();
List<Object> objList = intsList;
如果第二行寫成List objList = strList,可以通過編譯但會出現警告(型別不安全)。那如何表示泛型為一個通用泛型,就是定義個尖括號內可以放任意型別的泛型呢?這是就要使用型別萬用字元了。
3)型別萬用字元,’?’表示。可以宣告一個List<?>,作為任何泛型List的父型別。即List<?> objList = strList,這樣就沒啥問題了。
4)受限泛型,即給泛型定義上下限。簡單說,就是型別引數必須是某類及其子類(上限),或者是某類及其父類(下限)。
怎麼弄捏,例如List為傳入引數,限定型別引數必須為Number,如下:
public void fun(List<? extends Number> list) {…}
上述List只接收Number及Number的子類。另一種方式,只接收Integer及其父類,則如下:
public void fun(List<? super Integer> list) {…}
1.增強for迴圈
LinkedList類:
LinkedList<String> linkedList = new LinkedList(); linkedList.add("漢語"); linkedList.add("英語"); for(Iterator<String> iterator = linkedList.iterator();iterator.hasNext();){ System.out.println(iterator.next()); }
ArrayList類:
ArrayList<String> strings = new ArrayList<>();
strings.add("漢語");
strings.add("英語");
for(Iterator<String> iterator = strings.iterator();iterator.hasNext();){
String s = iterator.next();
System.out.println(s);
}
Vector類:
特有的迭代器方法:.elements();
Vector<String> strings = new Vector<>();
strings.add("漢語");
strings.add("英語");
for(Enumeration<String> elements = strings.elements();elements.hasMoreElements();) {
String s = elements.nextElement();
System.out.println(s);
}