title: 【学习之路】泛型使用
tags:


泛型的概念

所谓泛型,就是允许再定义类、接口时通过一个标识标识类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数在使用时会确定当前传入的类型

如何再集合类中使用泛型

泛型是在JDK5中新增的特性

  • ArrayList<Integer> list = new ArrayList<Intrger>();
  1. 在集合或接口中凡是定义类或接口时,内部结构使用到类的泛型位置,都指定为实列化后的泛型类型
  2. 泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置需要使用包装类
  3. 如果实列化时内有指明泛型类型,默认类型为Object类型

泛型使用 - 图1

泛型使用 - 图2

泛型使用 - 图3

JDK7中新特性,类型推断,当前面类型已经确定时后面可以不需要在声明

ArrayList<Integer> list = new ArrayList<>();

如何自定义泛型结构


定义泛型类

  1. 异常类不能是泛型类
  2. 静态方法中不能使用类的泛型
  1. // 尖括号中的字母需要使用大写字母,字母可以随意书写
  2. public class User<E> {
  3. String name;
  4. Integer age;
  5. // 当类声明了泛型结构后,类的内部就可以使用类的泛型
  6. E userE;
  7. public User(String name, Integer age, E userE){
  8. this.name = name;
  9. this.age = age;
  10. this.userE = userE;
  11. }
  12. }

定义泛型方法

  • 在泛型方法中出现了泛型结构,泛型参数与类的泛型参数没有任何关系
  • 泛型方法,可以声明为静态的,泛型方法在调用的过程中是确定的,并非在实列化的时候需要确定
  1. public <E> List<E> Test(E[] arr){}

通配符使用

类A是类B的父类,G<A>和G<B>是没有关系的,二中共同的父类是G<?>

  1. public void print(List<?> list){
  2. }

对于List<?>就不能向内部添加数据除了添加null以外

有限制条件的通配符

<? extends Number>:只允许泛型为Number及Number子类的引用调用

<? super Number>:值允许泛型类为Number及Number父类的引用调用

<? extends comparable>:只允许泛型类为实现Commparable接口的实现类的引用调用