如何從特征對象獲取對具體類型的引用?如何獲得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
提交
取消
