Effective Java
23.请不要在新代码中使用原生态类型
1.泛型(generic)类或接口:声明中具有一个或多个类型参数(type parameter)的类或接口。e.g. List<E>
2.每种泛型可以定义一组参数化的类型(parameterized type)。e.g. List<String>
3.每个泛型定义一个原生态类型。e.g. List
4.使用参数化类型来允许插入任意类型的对象。e.g. List<Object>
5.List<String>是List的子类型,而不是List<Object>的子类型。
6.在不确定或者不在乎集合中元素类型的情况下,可使用无限制的通配符类型。e.g. List<?>
7.通配符类型是安全的,原生态类型是不安全的。
例外:
1.在类文字中必须使用原生态类型。List.class,String[].class,int.class合法,List<String>.class,List<?>.class不合法
2.在参数化类型上使用instanceof操作符是非法的。
-------------------------------------------------------------------------------------------
24.消除非受检警告
1.当程序员能证明引起警告的代码是类型安全的场合下,可以使用@SuppressWarnings("unchecked")注解来禁止这条警告。
2.尽量在可能小的范围内使用SuppressWarnings注解,永远不要在类上使用,因为这很有可能掩盖重要的警告。
3.用注解将禁止该警告的原因记录下来
-------------------------------------------------------------------------------------------
25.列表优先于数组
1.数组是协变的(如果sub是super的子类型,那么数组类型sub[]就是super[]的子类型);
泛型是不可变的。对于任意两个类型Type1和Type2,List<Type1>既不是List<Type2>的子类型也不是List<Type2>的超类型。
2.数组是具体化的;泛型是通过擦除来实现的。
泛型只在编译时强化它的类型信息,在运行时丢弃(擦除)它的元素类型信息。