1、声明中具有一个或多个类型参数的类或接口叫做泛型类、泛型接口(统称泛型)
- List
- 每组泛型定义一组参数化的类型
2、每种泛型都带一个原声态类型
- 即不带任何实际类型参数的泛型名称
- List 的原声态类型是 List
- 如下就是一个原生集合
- 未作限制,集合里面什么都能更加
- 编译期不会报错,运行下述代码才会报错
- 后续提取使用,类型转换会有问题
- 在声明集合时限定死
- 这样如下编译期就会报错
3、不提供类型参数,使用集合类型和其他泛型也仍然合法
- 这样会失掉安全性和表述性所有优势
- java 允许这样做是为了和之前代码保持兼容性!
4、List是被允许的
- List 和List区别在于:前者逃避了泛型检查;后者明确告诉编译器,他可以持有任何类型
5、泛型子类型化规则
- List 是List 的子类型,和List不是一个类型
- List 会失去安全性,List不会
- 如下,可以进行编译,编译时会有一条警告(请不要忽视)
6、无限制通配符类型
- Set的无限制通配符类型为:Set(某个类型的集合)
- 无限定通配符在创建对象,创建泛型类、接口、方法都不能使用
- 经常和限定通配符extends,super一起使用
List list2 = new ArrayList(); // 只能增加null ,不能插别的任何元素 list2.add(null); test(list2);
7、本条的两个例外:
类文字中必须使用原生态类型
- 比如 List.class 、String[].class、int.class
- 不可以使用:List<String.class>、List<?>.class
- 由于泛型在运行时会被擦除
参数化类型而非无限制通配符上使用instanceOf 都是非法的
- 无限制通配符上可以使用instanceOf ,效果和原生态类型一样的
8、总结
- 不要在新代码中使用原生态类型
- 原生态代码仅仅是为了与引入泛型之前代码兼容和互用提供的
- Set<Object>是参数化类型,包含任何对象的一个集合(安全)
- Set<?>通配符类型,只包含某种未知对象的集合(安全)
- Set 原生态类型,脱离了泛型(不安全)