How to Use Associated Types in Traits

Define associated types in a trait using `type Name;` and specify the concrete type in the `impl` block to avoid generic parameters.

Use associated types in a trait definition to specify a placeholder type that implementors must define, then provide the concrete type in the impl block.

trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
}

struct Counter {
    count: u32,
}

impl Iterator for Counter {
    type Item = u32;
    fn next(&mut self) -> Option<Self::Item> {
        if self.count < 5 {
            self.count += 1;
            Some(self.count)
        } else {
            None
        }
    }
}