Java的基本使用之泛型
1、泛型的定義
泛型就是定義一種模板,例如 ArrayList<T>,然后就可以為用到的類創(chuàng)建對(duì)應(yīng)的 ArrayList<類型>。泛型的作用就是編寫模板代碼來適應(yīng)任意類型,然后我們就可以使用泛型來限制集合只可以存入某種類型的數(shù)據(jù)。
//下面定義了一種模板,即泛型。T可以是任何class public class ArrayList<T> { private T[] array; private int size; public void add(T e) {...} public void remove(int index) {...} public T get(int index) {...} } //編寫一次模版,可以創(chuàng)建任意類型的ArrayList,如下: // 創(chuàng)建只可以存儲(chǔ)String的ArrayList: ArrayList<String> strList = new ArrayList<String>(); // 創(chuàng)建只可以存儲(chǔ)Float的ArrayList: ArrayList<Float> floatList = new ArrayList<Float>(); // 創(chuàng)建只可以存儲(chǔ)Person的ArrayList: ArrayList<Person> personList = new ArrayList<Person>();
編譯器會(huì)針對(duì)類型作檢查,這樣一來,既實(shí)現(xiàn)了編寫一次,萬能匹配,又通過編譯器保證了類型安全:這就是泛型。
Java 中的泛型只在編譯階段生效。
2、使用泛型
泛型使用代碼示例:
List<String> list = new ArrayList<String>(); list.add("Hello"); String first = list.get(0); List<Number> list = new ArrayList<Number>(); list.add(new Integer(123)); list.add(new Double(12.34)); Number first = list.get(0); Number second = list.get(1);
編譯器如果能自動(dòng)推斷出泛型類型,就可以省略后面的泛型類型:
List<Number> list = new ArrayList<Number>();
//編譯器看到泛型類型List<Number>就可以自動(dòng)推斷出后面的ArrayList<T>的泛型類型必須是ArrayList<Number>,因此,可以把代碼簡寫為: List<Number> list = new ArrayList<>();
3、編寫泛型類
通常來說,泛型類一般用在集合類中,例如ArrayList<T>,我們很少需要編寫泛型類。但如果我們確實(shí)需要編寫一個(gè)泛型,可以按照下面步驟進(jìn)行編寫:
//先寫一個(gè)類 public class Pair { private String first; public Pair(String first) { } public String getFirst() { return first; } } //然后將特定類型轉(zhuǎn)換成T,即可編寫一個(gè)泛型 public class Pair<T> { private T first; public Pair(T first) { this.first = first; } public T getFirst() { return first; } }
Pair<String> t1 = new Pair<String>(); //在new Pair的時(shí)候指定泛型的類型String String s = t1.getFirst(); //在使用的時(shí)候就只能使用String類型
4、泛型的通配符
class Person { public void (List<?> list){ //test方法需要一個(gè)list集合的參數(shù),但是不確定該list集合存的數(shù)的類型,此時(shí)可以用通配符,表示任何類型的數(shù)據(jù)都可以 } } //使用 Person p = new Person(); List<Stiring> list = new List(); p.test(list); List<Integer> list2 = new List(); p.test(list2)
<? extends Person> //(無窮小, Person] 只允許放入Person或者Person的子類 <? super Person> //[Person, 無窮大) 只允許放入Person或者Person的父類 <? extends Comparable> //只允許放入實(shí)現(xiàn)了Comparable接口的實(shí)現(xiàn)類 <? extends 接口名> //只允許放入實(shí)現(xiàn)了該接口的實(shí)現(xiàn)類
class Person { public void Test(List<? extends Animal> list) {} //表示作為參數(shù)的集合,集合中只能存儲(chǔ)Animal或者Animal的子類的實(shí)例對(duì)象 }

浙公網(wǎng)安備 33010602011771號(hào)