我有一个 Vec<Box<T>>
其中 T
工具 Foo
.为什么我不能将它强制为 Vec<Box<Foo>>
即使我可以强制任何类型的 Box<T>
进入 Box<Foo>
?为什么下面的代码不能编译?
use std::vec;
trait Foo {}
struct Bar {}
impl Foo for Bar {}
fn main() {
let v = vec![Box::new(Bar {})];
let v_1 = v as Vec<Box<Foo>>;
}
最佳答案
因为 Box<Bar>
大小不同于 Box<Foo>
.允许对单个 值进行强制转换,但在这里您必须调整整个向量的大小。这本书在关于 Representation of Trait Objects 的部分对此进行了一些详细介绍。 .短版:Box<Bar>
是一个指向值的指针。 Box<Foo>
是一个指向值的指针和一个指向虚表的指针。
关于generics - 为什么 Rust 不允许强制转换容器内的特征对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41889727/