A generic parameter with no bound is nearly useless: the body may only do what works for every type, which is almost nothing.
A bound buys back capability by narrowing the input:
fn describe_all<T: Display>(items: &[T]) -> String
Now the body may call .to_string(), because Display guarantees it exists. The bound is a two-way contract: the caller must supply a Display type, and in exchange the body may rely on it.
