`
xusulong
  • 浏览: 79888 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Effective Java 2 读书笔记 第5章 泛型

阅读更多

该章23-29条主要讲述使用泛型对编程的安全性所带来的好处以及可以使API得到更广泛的应用。

23条:不要在新代码中使用原生态类型

使用原生态类型如list,你不能确定该对象里面的元素到底是什么type,会发生ClassCastException的错误,而且编译时发现不了,运行时才可以。而有了泛型,参数化可以使得编译器明确知道list中的类型,在表述和安全方面都有优势。

泛型有子类型化的规则,List<String>是原生态类型List的一个子类型,但是不是参数化类型List<Object>的子类型。

不能将任何元素(除了null之外)放入Collection<?> c,即c.add(a)是不对的,c.add(null)则成立

在不确定或者不在乎集合中元素类型的情况下,使用无限制的通配符,即Set<?>

Set<Object>是个参数化类型,可以包含任何对象类型

List<Object> strings = new ArrayList<Object>();
		strings.add(1);
		strings.add("d");

 Set<?>是一个通配符,可以支持任何一个集合,表示只能包含某种未知对象类型的一个集合

List<Object> objects = new ArrayList<Object>();
		objects.add(1);
		objects.add("d");
		List<?> s = objects;
		List<String> stings = new ArrayList<String>();
		s = stings;

 Set则是个原生态类型,脱离了泛型系统,是不安全的,只在Java 1.5之前使用

两个例外:

1.在类型文字中必须使用原生态类型,不可以使用参数化类型,List.class, String[].class和int.class都合法,但是List<String>.class,List<?>.class不合法

2.instanceof

24条: 消除非受检警告

  1. 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,(只有在这种情况下才)可以使用一个@SuppressWarnings("unchecked")注解来禁止这条警告
  2. 应该在尽可能小的范围中使用SuppressWarnings注解,不要再类上使用
  3. 没到使用@。。。的时候,都有加注释说明为什么这么做是安全的

25条:列表优先于数组

26条:优先考虑泛型

使用泛型比使用需要在客户端代码中进行转换的类型来的安全。

27条:优先考虑泛型方法

静态工厂方法尤其适合泛型化,泛型方法的好处类似于泛型,可以确保方法不经过转换使用。

28条:利用有限制通配符来提升API的灵活性

有限制的通配符

PECS原则,表示,producer-extends(List<? extends T>优先List<T>),consumer-super(List<? super T>优先List<T>)

不要用通配符作为返回类型

29条:优先考虑类型安全的异构容器

用类型作为Map的键

 

下一条 Effective Java 2 读书笔记 第6章 枚举和注解

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics