无法将&mut Box<dyn Trait>向下转换为&mut dyn Any?问题咨询
问题原因与解决方案:无法从
&mut Box<dyn Trait>向下转换为&mut dyn Any 核心问题所在
你这段代码的问题有两个:
- 你试图转换的对象是
&mut Box<dyn A>,当把它转成&mut dyn Any时,Any对应的实际类型是**Box<dyn A>**,而不是里面的B——相当于你在对装箱后的trait对象本身做类型转换,不是对内部的结构体实例操作。 - 自定义的
trait A没有继承Anytrait,这导致dyn A本身无法被当作dyn Any来处理,自然没法向下转换到具体类型。
修正后的代码实现
要实现对dyn A背后具体类型的向下转换,需要调整两点:让trait继承Any,然后直接对dyn A的引用进行操作,而不是对Box的引用。
use std::any::Any; // 让trait A继承Any,这样dyn A才能支持Any的类型转换 trait A: Any {} struct B; impl A for B {} fn main() { let mut a: Box<dyn A> = Box::new(B); // 直接获取dyn A的可变引用,而不是Box的引用 let a_ref: &mut dyn A = &mut *a; match a_ref.downcast_mut::<B>() { Some(_b) => println!("found b"), None => println!("found nothing") } }
补充说明
如果你的场景必须保留对Box<dyn A>的引用,也可以通过两次解引用拿到内部的dyn A引用再转换:
// 假设你有&mut Box<dyn A>类型的变量a_box_ref let a_ref: &mut dyn A = &mut **a_box_ref; match a_ref.downcast_mut::<B>() { // ... }
另外,Any的向下转换只支持'static类型(没有非'static生命周期参数的类型),你的B结构体满足这个要求,所以可以正常工作。
内容的提问来源于stack exchange,提问作者LucioleMaléfique
相关产品推荐
相关产品推荐

