From: Don't use boxed trait objects (bennetthardwick.com)
By default a Box<dyn Trait> doesn't implement the trait of the object it contains. This means that trying to construct PeopleZoo<Box<dyn Person>> won't work out of the box and will give a type error.
Because of this, it's good practice to give a default implementation of your trait for it's boxed counterpart. This can be done by calling as_ref or as_mut on the Box and calling the references relevant method.
For just a small bit of effort you can help a bunch of people that may consume your struct.
trait Person {
    fn say_hello(&self);
}
impl Person for Box<dyn Person> {
    fn say_hello(&self) {
        self.as_ref().say_hello()
    }
}
 
struct PeopleZoo<P: Person> {
    people: Vec<P>,
}
fn main() {
  let mut zoo: PeopleZoo<Box<dyn Person>> = PeopleZoo {
    people: vec![]
  };
}