extern crate downcast; // we need to use downcast::Any instead of std::any::Any use downcast::{downcast, Any}; /* Trait */ trait Animal: Any { fn what_am_i(&self); } downcast!(dyn Animal); /* Impl */ struct Bird; impl Animal for Bird { fn what_am_i(&self){ println!("Im a bird!") } } impl Bird { fn wash_beak(&self) { println!("Beak has been washed! What a clean beak!"); } } /* Main */ fn main() { let animal: Box = Box::new(Bird); animal.what_am_i(); { let bird = animal.downcast_ref::().unwrap(); bird.wash_beak(); } let bird: Box = animal.downcast::().ok().unwrap(); bird.wash_beak(); }