Java泛型中的协变与逆变是什么

发布时间:2025-04-26 23:35:47 作者:小樊
来源:亿速云 阅读:108

在Java泛型中,协变(covariance)和逆变(contravariance)是用来描述泛型类型参数之间的继承关系如何影响子类型的兼容性。这两个概念主要通过通配符? extends T? super T来实现。

协变(Covariance)

协变允许你使用一个比原始指定的派生类型更具体的类型。在Java中,协变通过? extends T来实现,这意味着类型参数是T或者是T的子类。协变主要用在返回值上,因为它保证了类型安全,即你不会得到一个不兼容的类型。

例如,假设我们有一个类层次结构:

class Animal {}
class Dog extends Animal {}

如果我们有一个方法返回Animal类型的对象,我们可以修改这个方法使其返回Dog类型的对象,因为DogAnimal的子类。在泛型中,我们可以这样写:

public List<? extends Animal> getCovariantList() {
    // ...
}

这个方法可以返回任何Animal类型的列表,包括Dog类型的列表。但是,由于我们不知道具体的子类型是什么,我们不能向这个列表中添加任何元素(除了null),因为编译器无法确定我们要添加的元素是否与列表的实际类型兼容。

逆变(Contravariance)

逆变允许你使用一个比原始指定的派生类型更泛化的类型。在Java中,逆变通过? super T来实现,这意味着类型参数是T或者是T的父类。逆变主要用在参数类型上,因为它允许你传递一个更具体的类型给一个期望泛型参数的方法。

例如,如果我们有一个方法接受Animal类型的对象:

public void addAnimal(List<Animal> animals) {
    // ...
}

我们可以修改这个方法使其接受Object类型的列表,因为Object是所有类的父类。在泛型中,我们可以这样写:

public void addContravariantAnimal(List<? super Animal> animals) {
    // ...
}

这个方法可以接受任何Animal类型的列表,包括List<Animal>List<Object>等。由于我们知道列表至少是Animal类型,我们可以向这个列表中添加Animal或其子类的对象。

总结

Java泛型的协变和逆变规则有助于编写更加灵活和类型安全的代码。

推荐阅读:
  1. 如何解析java web项目,k8s的yaml模板
  2. Java内存数据区域的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:如何生成有效的服务器运维Token

下一篇:Java泛型如何实现协变和逆变

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》