Java1.5发行版本中增加了泛型(Generic)。在没有泛型之前,从集合中读取到的每一个对象都必须进行转换。如果有人不小心插入了错误的类型对象,在运行时的转换处理就会出错。有了泛型之后,可以告诉编译器每个集合中接受哪些对象类型,编译器自动地为你的插入进行转化,并在编译时告知是否插入了类型错误的对象。这样可以使程序更加安全,也更加清楚。
No23 请不要在新代码中使用原生态类型
术语 |
示例 |
所在条目 |
参数化的类型 |
List<String> |
|
实际类型参数 |
String |
|
泛型 |
List<E> |
|
形式类型参数 |
E |
|
无限制通配符类型 |
List<?> |
|
原生态类型 |
List |
|
有限制类型参数 |
<E extends Number> |
|
递归类型限制 |
<T extends Comparable<T>> |
|
有限制通配符类型 |
List<? extends Number> |
|
泛型方法 |
static <E> List<E> asList(E[] a) |
|
类型令牌 |
String.class |
|
原生态类型允许存在的原因是兼容性考虑。
快速回顾:
- Set<Object>是个参数化类型,表示可以包含任何对象的一个集合;
- Set<?>则是一个通配符类型,表示只能包含某种未知对象类型的一个集合;
- Set则是个原生态类型,它脱离了泛型系统。前两种是安全的,最后一种不安全。
No25 列表优先于数组
下面的代码片段是合法的,却是不符合预期:
// Fail at runtime! Object[] objectArray = new Long[1]; objectArray[0] = “I don’t fit in”; // Throws ArrayStoreException
但下面这段代码则不合法,但却提醒了你怎样才能达到预期:
// Won’t compile! List<Object> o1 = new ArrayList<Long>(); // Incompatible types o1.add(“I don’t fit in”);
明显,利用列表可以在编译时发现错误。我们当然希望在编译时发现错误了。