Java 泛型
为什么?
只有指定类型才可以添加到集合中:类型安全
读取出来的对象不需要强转,便捷
Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行阶段。
泛型的使用
1. 泛型类
对象实例化时不指定泛型,默认为Object
泛型不同的引用不能相互赋值
1 | /** |
2. 泛型方法
方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
在类上定义的泛型,可以在普通的方法中使用。
在静态方法中,不能使用类定义的泛型,如果使用泛型,只能使用静态方法自己定义的泛型。
泛型方法在调用之前没有固定的数据类型,在调用时,传入的参数是什么类型,就会把泛型改成什么类型。也就说,泛型方法会在调用时确定泛型具体的数据类型。
3. 泛型接口
接口定义
1 | interface Generator<T>{ |
实现接口
未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需要将泛型的声明也一起加到类中。
1 | class FruitGenerator<T> implements Generator<T>{} |
传入泛型实参时,定义一个生产器实现这个接口,虽然只创建了一个泛型接口 Generator<T>
, 但是我们可以为 T
传入无数个实参, 形成无数种类型的 Generator 接口
在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型。
1 | Generator<T>, public T next(); // 中的T都要替换成传入的String类型 |
通配符
不确定集合中的元素具体的数据类型,使用 ?
表示所有类型
1 | // test 方法需要一个list集合的参数,但是不确定list集合中数据的具体类型 |
有限制的通配符
<? extends Person>
(无穷小,Person)
只允许泛型为 Person 及 Person 子类的引用调用
<? super Person>
(Person,无穷大)
只允许泛型为 Person 及 Person 父类的引用调用
<? extends Comparable>
(无穷小,Person)
只允许泛型为实现 Comparable 接口的实现类的引用调用
- 本文作者: Kelly Liu
- 本文链接: http://tiantianliu2018.github.io/2019/10/14/Java-泛型/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!