generics - 为什么 Rust 不允许强制转换容器内的特征对象?

标签 generics rust traits

我有一个 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/

相关文章:

java - 我应该使用泛型来解决这个问题吗?

rust - 用于读取文件 block 的迭代器

rust - 获取每行输入第一个单词的迭代器的简单实现

php - Codeigniter 3 : How to use composer packages?(Twilio SDK)

multithreading - 为什么不为包含Arc的结构实现Send?

unit-testing - Scala 中的单元测试助手或非接口(interface)特征

Java泛型,通配符的嵌套集合

c++ - 在 C++ 中使用模板

generics - 对 Kotlin 何时推断平台类型感到困惑

winapi - 为什么 WebViewControlProcess.CreateWebViewControlAsync() 永远不会完成?