将 `Arc<dyn Trait>` 向上转换为 `Arc<dyn Any>`?

问题描述 投票:0回答:1

假设我有一个类型为

Asset
的特征对象,它存储在
Arc
中,我想将其转换为
Arc<dyn Any>
以方便以后向下转型。

有什么安全的方法可以做到这一点吗?我已经尝试过这种(不安全)策略,但它似乎破坏了类型信息,因为我无法将结果

downcast
转换为其基本类型:
Arc<dyn Any>

但似乎不起作用。我知道目前有一个向上转换对象的实验性功能,但这似乎没有帮助。

rust casting unsafe
1个回答
1
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.