Short answer
Use a named type parameter <T extends Number> when you need to refer to the type elsewhere in the signature — relating arguments to each other or to the return type (e.g., <T extends Comparable<T>> T max(List<T>)).
Explanation
Use a wildcard when the method doesn't need to name the type and just operates on 'some unknown subtype', which keeps the signature simpler. A rule of thumb: if a type variable appears only once and you don't need its name, a wildcard is the cleaner choice.
Common mistakes
- Using a wildcard when you need the type in two places (bounded type parameter).
- Mixing up when a method needs <T> versus just <?>.