再谈Java泛型

一.类型参数的约束

我们可以对泛型传进来的参数做一些约束,比如说

用extends表明传进来的参数类型必须是必须是某个类型的子类型或者本身

再谈Java泛型_第1张图片

当然也可以用接口约束,也是用extends表明传进来的参数类型必须实现某个接口。用&连接,注意class需要写在接口前面

再谈Java泛型_第2张图片

但是在类的泛型声明中不能使用super

再谈Java泛型_第3张图片

因为泛型擦除后变为,Object又是所有类型的父类型,所有类型就都可以作为T,这是没有意义的事情

二.泛型方法

在返回类型的前面加上泛型就可以定义泛型方法,泛型方法参数中可以使用泛型

再谈Java泛型_第4张图片

需要注意下面的并不是泛型方法,只是使用了类中的泛型而已

再谈Java泛型_第5张图片

三.泛型不支持协变

协变,逆变,抗变等概念是从数学中来的,描述的是两个类型集合之间的继承关系。

Animal、Dog , Dog extends Animal

第一个集合为:List

第二个集合为:List

  • 协变(Covariance):List是List的子类型
  • 逆变(Contravariance): List是List的子类型
  • 抗变(Invariant): List与List二者间没有任何继承关系

由于泛型不支持协变,所以下面这样传参是不可以的

再谈Java泛型_第6张图片

但数组是默认支持协变的

再谈Java泛型_第7张图片

四.通配符

事实上,我们可以用通配符?来解决刚才的问题,?会匹配所有的类型

再谈Java泛型_第8张图片

当然我们可以用extends固定它的上界

也可以用super固定它的下界

你可能感兴趣的:(JavaSE基础,java,泛型)