假设我有一个类型为
Asset
的特征对象,它存储在Arc
中,我想将其转换为Arc<dyn Any>
以方便以后向下转型。
有什么安全的方法可以做到这一点吗?我已经尝试过这种(不安全)策略,但它似乎破坏了类型信息,因为我无法将结果
downcast
转换为其基本类型:Arc<dyn Any>
但似乎不起作用。我知道目前有一个向上转换对象的实验性功能,但这似乎没有帮助。
let res: Box<dyn Asset> = thing_that_returns_dyn_asset();
let res: Arc<dyn Asset> = Arc::from(res);
// Unsafe: Cast an Arc<dyn Asset> to an Arc<dyn Any>.
let res : Arc<dyn Any> = unsafe {
Arc::from_raw(Arc::into_raw(res).as_any())
};
转换为
Arc<Asset>
的方法。在 Arc<dyn Any>
之后,我们可以在自定义特征中做到这一点,并对其进行全面实现:as-any