How to convert Box in generics to Box.
from Container<Box<Dog>> to Container<Box<dyn Animal>>

//example
fn main() {
  let container: Container<Box<Dog>> = Container(Box::new(Dog()));

  let test: Container<Box<dyn Animal>> = container;
  // expected struct `RcHash<Box<dyn Enity>>`
  // found struct `RcHash<Box<Role>>`

  let test = container as Container<Box<dyn Animal>>;
  // non-primitive cast: `Container<Box<Dog>>` as `Container<Box<dyn Animal>>`
  // an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object
}

//struct
struct Container<T> (T);
struct Dog ();

//trait
trait Animal { fn echo(&self); }
impl Animal for Dog { fn echo(&self) { println!("dog"); } }

推荐答案

你不能在Box<Dog>Box<dyn Animal>之间做一个简单的cast,因为它们不完全是一回事.这两个Box都可能充当指向Dog实例的指针,但Box<dyn Animal>实际上将具有不同的size,因为特征对象也有一个额外的指针(用于vtable).我建议你阅读this,以便更好地理解关于特征对象的那部分.

上述情况意味着您无法避免创建一个新的Box<dyn Animal>实例,因此您无法避免创建一个新的Container<Box<dyn Animal>>实例(因为如果A != B=>;Container<A> != Container<B>/,您可以将!=解释为"不兼容"或"不同的size"/).

下面是一个如何从Box<Dog>个实例中"手动"创建新的Box<dyn Animal>个实例的示例:

let dog_box: Box<Dog> = Box::new(Dog());
let animal: Box<dyn Animal> = Box::new(*dog_box);

这基本上将move个Doggie实例(而不是创建另一个克隆).

这是您的 case 中更完整的例子:

let container: Container<Box<Dog>> = Container(Box::new(Dog()));
let cont_animal: Container<Box<dyn Animal>> = Container(Box::new(*container.0));

Rust相关问答推荐

PyReadonlyArray2到Vec T<>

为什么我的梅森素数代码的指数越大,速度就越快?

如何在Rust中实现Functor trait?

如何使用Match比较 struct 中的值

如何从铁 rust 中呼唤_mm_256_mul_ph?

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

AXUM一路由多个不包括URL的参数类型

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

为什么切片时需要参考?

Rust 并行获取对 ndarray 的每个元素的可变引用

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

为什么在 rust 中删除 vec 之前应该删除元素

我如何将特征作为 struct 的拥有字段?

当用作函数参数时,不强制执行与绑定的关联类型

为什么这个值在上次使用后没有下降?

将 (T, ()) 转换为 T 安全吗?

A 有一个函数,它在 Option<> 类型中时无法编译,但在 Option<> 类型之外会自行编译.为什么?