Map<Person, List<? extends Pet>> petPepole = New.map();
Map<Person, List<? extends Pet>> petPeople = new HashMap<Person, List<? extends Pet>>();
看这两行代码的对比↑↑↑
人们对泛型有一个抱怨,使用泛型有时候需要向程序中加入更多的代码。考虑第11章中的MapOfList.java类,如果要创建一个持有List的Map,就要像下满这样:
Map<Person, List<? extends Pet>> petPeople =
new HashMap<Person, List<? extends Pet>>(); // 抱怨需要加入过多的代码
看到了吧,你在重复自己做过的事情,编译器本来应该能够从泛型参数列表中的一个参数推断出另一个参数。唉,可惜的是,编译器暂时还做不到。然而,在泛型方法中,类型参数推断可以为我们简化一部分工作。
例如,我们可以编写一个工具类,它包含各种各样的static方法,专门用来创建各种常用的容器对象:
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<>();