这是示例代码的Rust Playground。
use std::any::Any;
pub trait MemorizedOutput: Any {
fn as_any(&self) -> &dyn Any;
}
impl<T: Any> MemorizedOutput for T {
fn as_any(&self) -> &dyn Any {
self
}
}
fn main() {
let a = Box::new(1i32) as Box<dyn MemorizedOutput>;
println!("{}", a.as_any().downcast_ref::<i32>().unwrap());
}
为什么上述代码在unwrap()
处死机。
Box<dyn MemorizedOutput>
实现Any
,因此它被MemorizedOutput
的一揽子实现所覆盖。根据https://doc.rust-lang.org/reference/expressions/method-call-expr.html,Rust更喜欢在Box<dyn MemorizedOutput>
上实现的方法,而不是取消引用的类型dyn MemorizedOutput
。所以a.as_any()
实际上是<Box<dyn MemorizedOutput> as MemorizedOutput>::as_any(&a)
,它显然不能下转换成i32
。