Java中函数参数的协变 contravariance

java中函数参数的协变 contravariance

Java 中协变和逆变的函数参数

在 Java 中,函数参数在协变和逆变方面表现出不同的行为。这会影响方法签名与继承关系的交互方式。

协变(covariant)

协变允许函数在派生类中以更具体的类型声明参数。这意味着基类可以接收派生类型的对象作为参数,但反之则不行。

立即学习“Java免费学习笔记(深入)”;

class Animal {    public void eat(Animal food) {}}class Dog extends Animal {    @Override    public void eat(Animal food) {}  // 协变:派生类参数类型更具体}

在此示例中,Animal 类的 eat 方法声明了一个 Animal 类型的参数。派生的 Dog 类可以覆盖 eat 方法并声明一个更具体的 Dog 类型的参数。这允许 Dog 类的方法接收 Dog 的对象,而 Animal 方法不能接收 Dog 的对象。

逆变(contravariant)

逆变允许函数在派生类中以更一般的类型声明参数。这意味着派生类可以接收基类型的对象作为参数,但反之则不行。

怪兽AI数字人 怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44 查看详情 怪兽AI数字人

interface Consumer {    void consume(T value);}class Cat implements Consumer {}  // 逆变:派生类参数类型更一般class Animal implements Consumer {    @Override    public void consume(Animal value) {}}

在此示例中,Consumer 接口声明了一个泛型方法 consume,接受一个 T 类型对象。Cat 类实现了 Consumer 接口并声明了一个更一般的 Animal 类型的参数。这允许 Cat 类的方法接收 Animal 的对象,而 Animal 方法不能接收 Cat 的对象。

实战案例:Comparable 接口

Comparable 接口定义了一个 compareTo 方法,用于比较两个对象的顺序。该接口支持协变和逆变。

interface Comparable {    int compareTo(T other);  // 协变:返回类型更具体}

Comparable 接口声明了一个协变返回类型。派生类可以覆盖 compareTo 方法并返回一个更具体的类型。

class Dog implements Comparable {    @Override    public int compareTo(Dog other) {  // 协变:返回类型更具体        return 0;    }}

此外,Comparable 接口还支持逆变参数。这意味着派生类可以将更具体的类型作为参数传递。

class Animal implements Comparable {    @Override    public int compareTo(Animal other) {  // 逆变:参数类型更一般        return 0;    }    public int compareTo(Dog other) {  // 逆变:参数类型更一般        return 0;    }}

通过协变和逆变的参数,Java 允许方法签名与继承关系灵活交互,以创建可扩展且类型安全的代码。

以上就是Java中函数参数的协变 contravariance的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/459038.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 02:41:01
下一篇 2025年11月8日 02:45:34

相关推荐

发表回复

登录后才能评论
关注微信