为什么dyn Trait未实现std::any::Any?Rust Arc向下转型报错解析
报错原因
- Rust 对 trait 对象的转换有明确限制:即使你定义的
LockableOption<T>继承了Any特征,dyn LockableOption<U>类型的 trait 对象也无法直接隐式转换为dyn Any类型的 trait 对象。因为 trait 对象的 vtable 只会存储当前 trait 的方法入口,不会自动包含父 trait 的全部入口,编译器找不到从dyn LockableOption到dyn Any的转换路径。 - 你尝试直接把
Arc<dyn LockableOption<U>>赋值给Arc<dyn Any + Send + Sync>类型的变量,属于两种不同 trait 对象的 Arc 直接转换,不符合 Rust 的类型规则,所以抛出类型不匹配错误。
修复方案
你可以给 LockableOption 特征添加显式转换为 Arc<dyn Any> 的辅助方法,就可以实现后续的 downcast 操作,修改后的参考代码如下:
use std::any::Any; use std::sync::{Arc, Mutex}; pub struct OnTheFlySwap<T: Sized> { inner: Arc<Mutex<Option<Box<T>>>>, } pub trait LockableOption<T: Sized>: Send + Sync + Any { // 新增显式转 Arc<dyn Any> 的方法 fn as_any_arc(self: Arc<Self>) -> Arc<dyn Any + Send + Sync>; } impl<T: Sized + Send + 'static> LockableOption<T> for OnTheFlySwap<T> { fn as_any_arc(self: Arc<Self>) -> Arc<dyn Any + Send + Sync> { self } } struct ArcHolder<U: Sized> { lockable_option: Arc<dyn LockableOption<U>>, } impl<U: 'static + Send + Sync + Sized> ArcHolder<U> { pub fn as_on_the_fly(&self) -> Result<&OnTheFlySwap<U>, ()> { // 先调用显式转换方法得到 Arc<dyn Any> let l = self.lockable_option.clone().as_any_arc(); match l.downcast::<OnTheFlySwap<U>>() { // downcast 出来的是 Arc<OnTheFlySwap<U>>,解引用后取地址即可得到目标引用 Ok(o) => Ok(&*o), Err(_) => Err(()), } } }
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

