集合框架——泛型

泛型的使用

  • 泛型定义:

        java5 开始出现的一种对 Java 语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数是实际参数的占位符一样.
泛型能保证大型应用程序的类型安全和良好的维护性;

  • 使用泛型的优势:

       类型安全,使编译器对泛型定义的类型做判断限制.如保证 TreeSet 里的元素类型必须一致;

       消除强制类型的转换,如,使用 Comparable 比较时每次都需要类型强转;

  • 泛型类声明

      在类声明时通过一个标识符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就 ok。
声明带泛型的类:

class 类名<泛型类型 1,泛型类型 2……>{
泛型类型 变量名;
泛型类型 方法名(){}
返回值类型 方法名(泛型类型 变量名){}
}

使用带泛型的类:

类名<具体类> 对象名 = new 类名<具体类>();
  • 类型参数规范

推荐使用规范-常见的泛型,泛型只保存在源文件中,class 文件中不存在;也就是说在编译阶段就会丢失。基本数据类型不能作为泛型类型。

  • 泛型的上限与下限
class A {}
class B extends A {}
class C extends A {}
class D extends B {}

明确点和范围两个概念

1. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<A>,List<B>,List<Object>

2. 如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围

3. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点

4. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值

5. List<?>和List 是相等的,都代表最大范围

6.List既是点也是范围,当表示范围时,表示最大范围

  • JVM如何理解泛型概念 —— 类型擦除

事实上,JVM并不知道泛型,所有的泛型在编译阶段就已经被处理成了普通类和方法。 处理方法很简单,我们叫做类型变量T的擦除(erased) 。

总结:泛型代码与JVM

① 虚拟机中没有泛型,只有普通类和方法。

② 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除)

③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。

无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字。

猜你喜欢

转载自blog.csdn.net/hd12370/article/details/81188075