java covariant 协变

Java 数组是协变(covariant)的,而泛型系统在不用 wildcard type 的 情况下是不协变的(invariant) 。比如可以把  Integer[]  赋值  Number[]  ,但是不能把  List<Integer>  赋值给  List<Number>  。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在编程语言中,协变(covariant)是指类型的继承关系在子类型中保持不变或者变得更加具体。换句话说,如果类型 A 是类型 B 的子类型,那么在协变的情况下,可以将类型 B 的实例赋值给类型 A 的引用或者使用类型 B 的实例作为类型 A 的参数。 协变的概念通常用于涉及继承关系的数据类型,比如数组、函数指针、泛型等。下面分别说明这些情况下的协变问题: 1. 数组协变:在某些编程语言中,允许将子类型的数组赋值给父类型的数组。这意味着如果类型 A 是类型 B 的子类型,那么可以将类型 B 的数组赋值给类型 A 的数组,但不能反过来。例如,如果有一个 Animal 类和一个 Cat 类是 Animal 的子类,那么可以将 Cat 类型的数组赋值给 Animal 类型的数组。 2. 函数指针协变:在某些编程语言中,允许将子类型的函数指针赋值给父类型的函数指针。这意味着如果类型 A 是类型 B 的子类型,那么可以将类型 B 的函数指针赋值给类型 A 的函数指针,但不能反过来。这样做的好处是可以在调用函数时更加灵活,可以传递具体类型的函数指针作为参数。 3. 泛型协变:在某些编程语言中,泛型类型也可以是协变的。这意味着如果类型 A 是类型 B 的子类型,那么可以将泛型类型 B 的实例赋值给泛型类型 A 的实例。这样可以更灵活地使用泛型类型,提高代码的复用性和可扩展性。 需要注意的是,协变只能应用于具有继承关系的类型之间,而不能应用于没有继承关系的类型。此外,协变是一种类型系统的特性,不同的编程语言对于协变的支持程度和具体规则可能有所不同。因此,在使用协变时需要注意语言的约束和规范,以避免潜在的类型错误和不一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值