加载中...

型变(variance)描述复合类型的子类型关系如何随其组成部分变化。若 Cat 是 Animal 的子类型:协变(covariant)意味着 List<Cat> 可当作 List<Animal> 使用;逆变(contravariant)意味着接受 Animal 的处理器可当作接受 Cat 的处理器;不变(invariant)则两者互不兼容。
通用原则是「输出位置协变、输入位置逆变」:函数类型对返回值协变、对参数逆变。只读容器可安全协变,只写容器可安全逆变,可读写容器只能不变。Java 早期数组设为协变而未遵守此规律,导致需要运行时检查补救,是经典反例。
Java 用通配符 ? extends / ? super 表达使用处型变;C#、Kotlin、Scala 用 out/in 或 +/− 在声明处标注型变。
正确的型变规则让泛型 API 既灵活又保持类型安全。

登录 后参与讨论
暂无讨论,来发表第一条评论吧