为什么 Swift 中允许将子类实例分配给泛型类型?

问题描述 投票:0回答:1
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>

swift
1个回答
0
投票

不变性意味着

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>
变量。就这样就好了。

© www.soinside.com 2019 - 2024. All rights reserved.