为了账号安全,请及时绑定邮箱和手机立即绑定

如何从特征对象获取对具体类型的引用?

如何从特征对象获取对具体类型的引用?

如何从特征对象获取对具体类型的引用?如何获得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有任何用处; 不要用它!

在这个非常相似的问题中有更好的选择:如何匹配特质实现者


查看完整回答
反对 回复 2019-08-02
  • 2 回答
  • 0 关注
  • 661 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信