我正在尝试从 &dyn T
获取 Box<dyn T>
,如下例所示。但是,它无法编译。
trait MyTrait {
}
struct Foo;
impl MyTrait for Foo {}
fn main() {
let b: Box<dyn MyTrait> = Box::new(Foo);
let c: &dyn MyTrait = &b;
}
错误信息是
error[E0277]: the trait bound `Box<dyn MyTrait>: MyTrait` is not satisfied
--> src/main.rs:10:27
|
10 | let c: &dyn MyTrait = &b;
| ^^ the trait `MyTrait` is not implemented for `Box<dyn MyTrait>`
|
= note: required for the cast to the object type `dyn MyTrait`
很明显,您可以从 &T
获得 Box<T>
。我不明白为什么你不能从 &dyn T
得到 Box<dyn T>
。
答案 0 :(得分:3)
要从 &dyn T
获取 Box<dyn T>
,请使用 &*
:
let c: &dyn MyTrait = &*b;
*
用于将框解引用到其内容 (dyn MyTrait
) 中,然后 &
用于获取它作为引用。 >
这也是从 &Foo
获取 Box<Foo>
的“正确”方式。 &b
适用于具体类型的原因是因为 Deref
trait 允许 &Box<T>
被强制到 &T
:
如果 T 实现了 Deref
它对 trait 对象不起作用的原因是 &dyn MyTrait
可能 对 &Box<...>
有效,并且即使它失败也不会尝试强制转换。 >