第23条:请不要在新代码中使用原生类型
用泛型可以在编译期间发现错误。错误越早发现越好。
第24条:消除非受检警告
还是推荐用法泛型在编译期就确定好集合、列表中的类型。
@Test
public void Test(){
Set s2 = new HashSet(); //被认为不安全
Set<Son2> s3 = Sets.newHashSet(); //安全
Set<Son2> s4 = new HashSet<Son2>(); //安全
}
public static <E> HashSet<E> newHashSet() {
return new HashSet();
}
第25条:列表优于数组
如果使用数组, 有可能会写不安全的代码,例如:
Object[] o = new Integer[2];
o[0] = "abc";
用泛型列表就很安全,不用担心存错类型。
数组与列表的区别:
- 数组是协变的,如果Sub为Super的子类型,那么Sub[]就是Super[]的子类型,而在泛型中,ArrayList<Sub>与ArrayList<Super>没有父子关系。
- 数组是具体化的, 只有在运行的时候才会去检查元素的类型约束,而泛型是在编译时强化它们的类型信息,并在运行时丢弃(擦除)成Object。
第26:优先考虑泛型
类上的泛型, 成员变量就可以用这个传进来的类型。
public class Son2<E> {
public List<E> list = Lists.newArrayList();
}
第27:优先考虑泛型方法
使用泛型方法
public static <E> ArrayList<E> newArrayList() {
return new ArrayList();
}
public class Son2<T> {
List list;
public <E> List<E> listadd(E t) {
if (list == null)
list = Lists.newArrayList();
list.add(t);
return list;
}
}