《Effective Java》读书笔记四(泛型)

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”);

明显,利用列表可以在编译时发现错误。我们当然希望在编译时发现错误了。

posted @ 2013-08-08 11:48  那些年的事儿  阅读(570)  评论(0编辑  收藏  举报