有什么不同?
Box和其他标准库类型有一个非常特殊的情况,它们可以包含动态大小的值,如
dyn A.
let c = Arc::new(Mutex::new(Some(Box::new(B{}))));H { c: c };在此代码中,您已将变量
c(没有类型声明)初始化为类型推断为 的值
Arc<Mutex<Option<Box<B>>>,然后尝试将其存储在类型为 的字段中
Arc<Mutex<Option<Box<dyn A>>>。这是行不通的,因为这两种类型具有不同的内存布局。
let c: Arc<Mutex<Option<Box<dyn A>>>> = Arc::new(Mutex::new(Some(Box::new(B{}))));在这段代码中,你已经给
c一个类型声明,作为结果,其中需要
dyn知道在哪里的建造点,这使得胁迫很快发生,你可以强迫一个
Box<B>到
Box<dyn A>的,因为
Box实现了特殊的特质
CoerceUnsized. (相同的机制适用于转换
&B为
&dyn A。)但是,这不适用于包含a 的任意类型
Box<B>——甚至不适用
Option<Box<B>>,更不用说更复杂的类型了。
你可以
c在构造它时给出一个类型:
let c: Arc<Mutex<Option<Box<dyn A>>>> = Arc::new(Mutex::new(Some(Box::new(B{}))));H { c: c };或者,稍微短一点但更奇怪,您可以只
Box用它需要的类型注释 的直接容器:
let c = Arc::new(Mutex::new(Some::<Box<dyn A>>(Box::new(B{}))));H { c: c };或者您可以使用
as运算符编写显式强制:
let c = Arc::new(Mutex::new(Some(Box::new(B{}) as Box<dyn A>)));H { c: c };


