1. trait Iterator {
    2. type Item;
    3. fn next(&mut self) -> Option<Self::Item>;
    4. }
    5. trait Iterator<Item> {
    6. fn next(&mut self) -> Option<Item>;
    7. }

    you use Associated Type if you expect there only one implement of the trait for given type Item, for example HashMap, there is only one iterator type for it that is something yield the value of hashmap entry.

    Otherwise you want multiple implementation for give type you shoud use generic Type paratmeter