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

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

如何获得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


猛跑小猪
浏览 662回答 2
2回答

四季花海

应该很清楚,如果有另一种类型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有任何用处;&nbsp;不要用它!在这个非常相似的问题中有更好的选择:如何匹配特质实现者
打开App,查看更多内容
随时随地看视频慕课网APP