如何从特征对象获取对具体类型的引用?如何获得Box<B>或&B或&Box<B>从a在此代码变量:trait A {}struct B;impl A for B {}fn main() { let mut a: Box<dyn A> = Box::new(B); let b = a as Box<B>;}此代码返回错误:error[E0605]: non-primitive cast: `std::boxed::Box<dyn A>` as `std::boxed::Box<B>` --> src/main.rs:8:13 |8 | let b = a as Box<B>; | ^^^^^^^^^^^ | = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
2 回答
四季花海
TA贡献1811条经验 获得超5个赞
应该很清楚,如果有另一种类型C
实现A
并且你试图强制Box<C>
转换为强制转换,则强制转换可能会失败Box<B>
。我不知道你的情况,但对我来说,它看起来很像你将其他语言(如Java)的技术引入Rust。我从未在Rust中遇到过这种问题 - 也许你的代码设计可以改进以避免这种类型的转换。
如果你愿意,你可以“投射”任何东西mem::transmute
。可悲的是,我们将有一个问题,如果我们只是想投Box<A>
来Box<B>
或&A
于&B
因为一个指向trait
是脂肪指针,实际上包含两个指针:一个实际的对象,一到vptr的。如果我们将它转换为struct
类型,我们可以忽略vptr。请记住,这个解决方案是非常不安全和非常hacky - 我不会在“真正的”代码中使用它。
编辑:拧,这比我想象的更不安全。如果你想以这种方式正确地做到这一点你必须使用std::raw::TraitObject
。但这仍然不稳定。我不认为这对OP有任何用处; 不要用它!
在这个非常相似的问题中有更好的选择:如何匹配特质实现者
添加回答
举报
0/150
提交
取消