我们想将 dyn trait 转换成目标实现类型 T
Arc<RWLock<dyn Object>> 转换 Arc<RWLock<DbPool>>
向下转型
正常情况下,我们先转换 as_any 获取 &dyn Any类型 然后才可以进行向下转型 downcast_ref::
fn as_any(&self) -> &dyn Any {
self
}
let mysql_pool : Arc<RWLock<dyn Object>> = factory.get_object::<DbPool>("app1", object_id)
let db_pool = mysql_pool.as_any().downcast_ref::<DbPool>().unwrap();
原始指针转型
通过原始指针进行转换我们的目标类型,前提要判断下类型是否一致
原始指针可以直接转换,不用转换any类型,再向下转型,只需要判断类型一致,可以直接转换,简单,快速,注意是unsafe
不过我们判断类型一致就可以了
if type_id == TypeId::of::<T>() {
let value : Arc<RWLock<dyn Object>> = factory.get_object::<DbPool>("app1", object_id)
// 将 object 转换为原始指针
let object = Arc::into_raw(value);
// 将原始指针转换为我们实际的实现目标类型
let object = unsafe { Arc::from_raw(object as *const RwLock<T>) };
return Some(object);
}