Java 泛型的介绍

106 阅读2分钟

泛型:把元素的类型设计成一个参数,这个类型参数叫做泛型。

泛型的概念

  • 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。
  • 从 JDK1.5 以后,Java 引入了“参数化类型 ( Parameterized type) ”的概念,允许我们在创建集合时再指定集合元素的类型,正如: List,这表明该 List 只能保存字符串类型的对象。
  • JDK1.5 改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量、创建集合对象时传入类型实参。

总结

  • 如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为 Object 类型。
  • 由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。
  • 泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系。
  • 泛型方法可以声明为静态的。原因:泛型参数是在调用方法时确定的,并非在实例化类时确定。

通配符的使用

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

对于使用通配符的类,就不能向其内部添加数据,除了添加 null 之外

有限制的通配符

  • :允许所有泛型的引用调用。
  • 通配符指定上限

    • 上限 extends:使用时指定的类型必须是继承某个类,或者实现某个接口,即 <=
  • 通配符指定下限

    • 下限 super:使用时指定的类型不能小于操作的类,即>=
 // 举例
 <? extends Number>
   只允许泛型为 NumberNumber 子类的引用调用
 <? super number>
   只允许泛型为 NumberNumber 父类的引用调用
 <? extends Comparable>
   只允许泛型为实现 Comparable 接口的实现类的引用调用