extern crate downcast; // careful: do not combine downcast_sync! with downcast::Any, you will get `size not known at compile time` errors use downcast::{downcast_sync, AnySync}; use std::sync::Arc; /* Trait */ trait Service: AnySync { fn what_am_i(&self); } downcast_sync!(dyn Service); /* Impl */ struct Database {} impl Service for Database { fn what_am_i(&self){ println!("I'm a database!"); } } impl Database { fn purge_data(&self) { println!("Database has been purged! Goodbye, data!") } } fn main(){ let service: Arc = Arc::new(Database{}); service.what_am_i(); { let db = service.downcast_ref::().unwrap(); db.purge_data(); } let db: Arc = service.downcast_arc::().ok().unwrap(); db.purge_data(); }