章节摘抄
- 新写的代码中有泛型支持的要加上检测,别去掉。e.g. List
而不是直接 List list=… - 消除非受检警告
- 列表优先于数组
- 优先考虑泛型 - 这个建议中给出的 Stack 例子,属实没有 get 到他要讲的点
泛型那段读不下去了,很多概念性的东西读起来很吃力,需要再重新看看泛型相关的知识点了,应该可以结合 Collection 来看效果会比较好。
请不要在新代码中使用原生态类型
原生态类型指的是原本可以使用泛型的地方,没有指定,比如 List
泛型给了你在编译器检测类型匹配的能力
List
现在还能使用原生态类型是为了向下兼容,Java 1.5 才出的泛型
无限制通配符类型,比如 Set
Java 1.5 之后,只有两种情况允许使用原生态类型,一种是类 class 操作的时候,比如 List.class, String[].class, int.class。另一种是与 instanceof 相关的操作,比如 if(o instance of Set)
消除非受检警告
使用泛型是会碰到很多 unchecked warning,把他们都修复,这个可以保证代码运行时不会出现 ClassCastException.
列表优先于数组
数组是协变的(covariant),如果 sub 是 super 的子类,那么 sub[] 就是 super[] 的子类。
泛型是不可变的(invariant), 如果 Type1 是 Type2 的子类,List
作则认为上面的这种特性是数组的缺点。举个例子,下面两种变量都不能将 String 放入变量中,第一种要运行时才能发现,第二种编译期就抛错了。
1 | Object[] a = new Long[1]; |
数组是具体化的,泛型则通过擦除机制保证代码的通用性。应为数组的类型不安全的,所以不能创建泛型数组,这种做法和泛型的定义相违背。
像 E, List
当遇到泛型数组创建错误时,最好的方案是用集合类型List
一般来说,数组和泛型不能混用,如果混合使用时出现编译错误或警告,第一反应因该是用列表代替数组。