protocol Shape {}
struct Box<T: Shape> {
let shape: T
}
class Rect: Shape {}
class Square: Rect {}
let box: Box<Rect> = Box(shape: Square())
由于泛型类型是不变的,我预计这是一个编译错误,因为
Box<Rect>
和 Box<Square>
是不同的类型。但是,代码确实可以编译。
为什么 Swift 允许在这里将
Box(shape: Square())
赋值给 Box<Rect>
?
不变性意味着
Box<Square>
不是 Box<Rect>
。如果您构造一个 Box<Square>
并将其分配给您的 Box<Rect>
变量,则无法编译。但这不是你正在做的事情。
A
Square
仍然是 Rect
。 Box<Rect>
由单个 Rect
构造而成,而 Square
是 Rect
,因此 Square
可以是用于构造 Rect
的 Box<Rect>
。您正在做的是用您的 Box<Rect>
构造一个 Square
,并将其分配给您的 Box<Rect>
变量。就这样就好了。