"But still, this is essentially..." <- Not really... They're very distinct concepts although can totally understand they feel similar. There's overlap in the things they can accomplish but dyn lets you write code that is impossible to express with generics/impl trait. A generic type, whether an actual generic or expressed using the impl trait syntax, is like saying "for each single type that impls Trait, I want you to compile a separate version of this code, compiler." `dyn Trait` on the other hand is like saying, "for *all types* that impl Trait, I want you to compile code that works for all of them at the same time". This is an important distinction because for example, if you return an `impl Trait` *all code paths* in your function must return the *same type* that impls Trait. If you return a `Box`, each return path can return a different type which have all been "unified" into the single type `Box` (`Box` is the same thing as just `impl Trait` but enforcing it's in a box on the heap). Similarly if you make a `Vec` (that syntax doesn't actually work I think, but in my example it would just be `Vec where T: Trait`), you can't store different concrete T inside it, just a *single* T which must impl Trait. But `Vec>` lets you store a collection where each item may be a different underlying type but they all impl Trait