第23条:请不要在新代码中使用原生态类型
泛型(generic type):声明中具有一个或者多个类型参数的类或者接口的统称。
原生态类型(raw type):不带任何实际类型参数的泛型名称。
每个泛型都定义一个原生态类型,即不带任何实际类型参数的泛型名称,如List对应的原生态类型是List。
原生态类型和泛型对比:
原生态类型 (如List)
无编译前错误提示
取值需要强转对应类型
泛型:(如List<E>)
编译前有错误提示或者警告
取值时不需要强转,直接获取对应类型
原生态类型失掉了泛型在安全性和表述性方面的优势,但即使这样,原生态类型依然存在,主要原因是早期版本存在量大,并已经根深蒂固,所以要保证其合法使用,即移植兼容性。
无限制的 通配符类型 ?
无限制通配类型Set<?>和Set的区别: 如果不确定或者不关心实际的类型参数,就使用无限制通配类型,不能将任何元素(除null外)放到Set<?>中,如果尝试这样做,在编译时就会提示错误。
和原生态类型相比,通配符是安全的,所以当不确定类型时,建议使用 ?。
总之,使用原生态类型会在运行时导致异常,因此不要在新代码中使用。除非是类文字中或者instanceof中才使用原生态类型。Set是参数化类型,表示可以包含任何对象类型的集合。Set<?>是通配符类型,标示只包含某种未知对象类型的集合。Set则是原生态类型。前两种是安全的,最后一种不安全。