这个名字很直接,幽灵数据,不过使用时经常会有些疑问。
简介
简单来说,这是一个零成本的抽象,在运行时类似 ()
类型,毫无成本;而在编译过程中,则会被视为指定的类型,这里有两层,可以是类型,也可以是生命周期。
型变
一般是编程语言中类型系统 (尤其是泛型) 中的概念,用来描述父子类型使用过程中是否允许替换,例如 Rectangle
是 Shape
的子类型,那么有如下规则:
- 协变 Covariance 使用父类 (Shape) 的地方可以用子类 (Rectangle) 替换。
- 逆变 Contravariance 使用子类 (Rectangle) 的地方可以使用父类 (Shape) 替换。
- 不变 Invariance 两者不能相互替换。
在 Java 中有继承关系,其中:A) 函数如参是协变,返回值是逆变;B) 泛型支持协变 <? super T>
和逆变 <? extends T>
两种。通常,逆变是希望使用更加具体的子类型。
而 Rust 没有继承的概念,但是生命周期采用的是相同的方式,详细可以查看 死灵书 - 子类型和协变 的内容,这里简单介绍。