Java|阿里开源5天被网友疯狂转载的Java泛型详解手册,带你一文通关( 二 )


【Java|阿里开源5天被网友疯狂转载的Java泛型详解手册,带你一文通关】编译器只知道集合元素是下限的父类型 , 但具体哪种父类类型不确定 , 此类泛型集合能向其中添加元素(因为实际赋值的集合元素总是逆变声明的父类) , 从集合中取元素时只能被当做Object类型处理(编译器无法确定取出的到底是哪个父类对象) 。
逆变的泛型只能调用泛型类型作为参数的方法 , 而不能调用泛型类型作为返回值类型的方法 。 口诀是只进不出 。
泛型方法的定义:在修饰符与返回值之间用尖括号定义 , 见示例代码:
设定泛型形参上限
不仅允许在使用通配符时候设定上限 , 还可以在定义泛型形参时候设置上限 , 用于表示传给该泛型形参的实际类型要么是该上限类型 , 要么是该上限类型的子类 。
在一种极端情况下 , 程序需要为泛型形参设定多个上限(至多一个父类上限 , 多个接口上限) , 表明该泛型形参必须是其父类的子类(是父类本身也行) , 并且实现多个上限接口 。 类上限必须位于第一位 。
泛型方法泛型方法的定义
泛型方法是指在声明方法时 , 定义一个或多个泛型形参 。 语法格式为:
修饰符 <TS> 返回值类型 方法名(形参){
…………
方法声明中定义的泛型只能在该方法里使用 , 而接口、类声明中定义的泛型可以在整个接口、类中使用 。
方法中的泛型参数无需显式传入实际类型参数 , 而是根据实参推断出泛型所代表的类型 。
为了避免类型推断错误 , 可以使用通配符上限 , 比如:
问:何时使用泛型方法 , 何时使用类型通配符呢?二者区别是什么?
泛型方法与类型通配符的区别
大多数时候都可以用泛型方法来代替类型通配符 , 比如:
虽然可以转化 , 但方法中的泛型形参T只使用了一次 , 唯一效果是可以在不同的调用点传入不同的实际类型 , 对于这种情况 , 应该使用通配符 , 它毕竟是被设计用来支持灵活的子类化的 。
泛型方法允许泛型形参被用来表示方法的一个或多个参数之间的类型依赖关系 , 或者方法返回值与参数之间的类型依赖关系 。 如果没有这样的类型依赖关系 , 就不该使用泛型方法 。
ps:如果有需要 , 也可以同时使用泛型方法与通配符 。 支持协变的集合可以安全地取出元素 。 比如:Collections.copy()方法
菱形语法与泛型构造器
java也允许在构造器签名中声明泛型形参 , 类似于在方法签名中声明泛型形参一样 。 这样就产生了所谓的泛型构造器 。 例如:
前面介绍了菱形语法:它允许调用构造器时在构造器后使用一对尖括号来代表泛型信息 , 但是如果程序显式指定了泛型构造器中声明的泛型形参的实际类型 , 则不可以使用菱形语法 , 例如:
泛型方法与方法重载
重载(两同一不同):同一个类中 , 同一方法名 , 形参列表不同才是重载!
重写(两同两小一大):

  1. 同一个方法名 , 同一个形参列表;
  2. 子类方法返回值与子类方法声明抛出的异常类应比父类方法返回类型更小或相等 , 比父类方法声明抛出的异常类更小或相等;
  3. 子类方法的访问权限要比父类大或相等 。
因为泛型允许设定通配符上限与通配符下限 , 从而允许在一个类里包含如下两个方法定义:
编译器无法确定函数调用了哪个copy方法 , 会引起编译错误 。
好啦 , 今天的文章就到这里了 , 希望能够帮助到屏幕前迷茫的你们