Here is the Rust Playground of the example code.
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()中会死机?
发布于 2021-04-22 12:25:13
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。
https://stackoverflow.com/questions/67206692
复制相似问题