对于 Java 5.0 中新增的泛型工具,一个常见的抱怨就是,它使代码变得太冗长。原来用一行就够的变量声明不再存在了,与声明参数化类型有关的重复非常讨厌,特别是还没有良好地支持自动补足的 IDE。例如,如果想声明一个 Map
,它的键是 Socket
,值是 Future<String>
,那么老方法就是:
Map socketOwner = new HashMap();
比新方法紧凑得多:
Map<Socket, Future<String>> socketOwner
= new HashMap<Socket, Future<String>>();
当然,新方法内置了更多类型信息,减少了编程错误,提高了程序的可读性,但是确实带来了更多声明变量和方法签名方面的前期工作。类型参数在声明和初始化中的重复看起来尤其没有必要;Socket
和 Future<String>
需要输入两次,这迫使我们违犯了 “DRY” 原则(不要重复自己)。
更安全的技巧
一个更安全的减少声明泛型集合所需打字量的技巧是使用类型 (type inference)。编译器可以非常聪明地使用程序中内嵌的类型信息来分配类型参数。如果定义了下面这样一个工具方法:
public static <K,V> Map<K,V> newHashMap() {
return new HashMap<K,V>();
}
那么可以安全地用它来避免录入两次参数:
Map<Socket, Future<String>> socketOwner = Util.newHashMap();
这种方法之所以能够奏效,在于编译器可以根据泛型方法 newHashMap()
被调用的位置推导出 K
和 V
的值。