1/6

Both of these let a trait be generic over a type. They mean different things:

trait Source      { type Item;    fn next_item(&mut self) -> Option<Self::Item>; }
trait Source<T>   {               fn next_item(&mut self) -> Option<T>; }

With an associated type, a type implements Source once, and picks Item as part of that single implementation.

With a generic parameter, a type may implement Source<u32>, Source<String>, Source<Frame> — as many times as it likes.