Sized marks types whose size is known at compile time. Generic type parameters require Sized by default; `T: ?Sized` makes that bound optional. Trait objects are unsized, so they cannot be stored directly or in a `Vec`. Smart pointers such as `Box` can hold them: construct a box from a concrete type, then coerce it to `Box<dyn Trait>`. section 2.2.6 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
A vector can store boxes of different concrete types through a shared trait object; calls are limited to methods on that trait. section 2.2.6
