Map<Person, List<? extends Pet>> petPepole = New.map();
Map<Person, List<? extends Pet>> petPeople = new HashMap<Person, List<? extends Pet>>();
看這兩行代碼的對比↑↑↑
人們對泛型有一個抱怨,使用泛型有時候需要向程序中加入更多的代碼??紤]第11章中的MapOfList.java類,如果要創(chuàng)建一個持有List的Map,就要像下滿這樣:
Map<Person, List<? extends Pet>> petPeople =
new HashMap<Person, List<? extends Pet>>(); // 抱怨需要加入過多的代碼
看到了吧,你在重復自己做過的事情,編譯器本來應該能夠從泛型參數列表中的一個參數推斷出另一個參數。唉,可惜的是,編譯器暫時還做不到。然而,在泛型方法中,類型參數推斷可以為我們簡化一部分工作。
例如,我們可以編寫一個工具類,它包含各種各樣的static方法,專門用來創(chuàng)建各種常用的容器對象:
public class New {
public static <K, V> Map<K, V> map() {
return new HashMap<K, V>();
}
public static <T> List<T> list() {
return new ArrayList<T>();
}
public static <T> LinkedList<T> lList() {
return new LinkedList<T>();
}
public static <T> Set<T> set() {
return new HashSet<T>();
}
public static <T> Queue<T> queue() {
return new LinkedList<T>();
}
public static void main(String[] args) {
Map<String, List<String>> sls = New.map();
List<String> ls = New.list();
LinkedList<String> lls = New.lList();
Set<String> ss = New.set(); // 這里看的最明顯 New.set() 看著是不是簡潔了不少.
Queue<String> qs = New.queue();
}
}
Set<String> ss = New.set();
這里看的最明顯 New.set() 看著是不是簡潔了不少.
這真的是古早的Java,可能作者在編寫Tink in Java 的時候,Java就是這個樣子。
但是我現在用的Java好像能做到了。
以前必須這樣
Map<Person, List<? extends Pet>> petPeople = new HashMap<Person, List<? extends Pet>>();
現在可以這樣
Map<Person, List<? extends Pet>> petPeople2 = new HashMap<>();