An unsized type has no compile-time-known size for direct storage. Trait objects such as `dyn MyTrait` are unsized, so they cannot be stored directly in a `Vec`. A smart pointer such as `Box` can hold one: the concrete type is known when the box is created, then coerced to the trait-object type. section 2.2.6
let mut v = Vec::<Box<dyn MyTrait>>::new();
v.push(Box::new(MyStruct1 {})); #1
v.push(Box::new(MyStruct2 {})); #2
v.iter().for_each(|i| i.trait_hello()); #3
// v.iter().for_each(|i| i.struct_hello()); error! #4
See a `Vec` containing boxed trait objects for two concrete types; each can call the trait method, but not a concrete-type-only method. section 2.2.6
