100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace

Bounded Type Parameters Explained

Bounded type parameters explained — <T extends Bound> syntax, multiple bounds, and a Comparable-based Java example with interview Q&A.

mediumQ140 of 226 in Object Oriented Programming Est. time: 6 minsLast updated:
Open Code Lab

Expected Interview Answer

A bounded type parameter restricts a generic type parameter to a specific type or its subtypes, written as `<T extends Upper>` in Java, so the generic class or method can rely on and call the members that the bound guarantees, rather than only the members every Object has.

Without a bound, a type parameter like `T` in `class Box<T>` could be any reference type, so the compiler only lets you call methods that exist on every Object (equals, hashCode, toString) — you cannot call compareTo() or doubleValue() because the compiler cannot prove T has them. Writing `<T extends Comparable<T>>` or `<T extends Number>` tells the compiler “whatever type is substituted here is guaranteed to be Comparable, or a Number,” which unlocks calling those bound-specific methods inside the generic code while still working for any type satisfying the constraint. Despite the keyword `extends`, the bound can be a class or an interface, and Java allows multiple bounds with `&` (`<T extends Number & Comparable<T>>`), with at most one class bound and it must come first. Bounded wildcards (`? extends T`, `? super T`) extend this same idea to method parameters that only need to read or only need to write a generic collection (the PECS — Producer Extends, Consumer Super — rule).

  • Lets generic code call methods guaranteed by the bound instead of only Object methods
  • Keeps compile-time type safety while still supporting a family of related types
  • Documents intent — the bound tells readers exactly what capability the type must have
  • Enables writing genuinely reusable, constrained algorithms like a generic max() function

AI Mentor Explanation

A tournament rule that says “any all-rounder who bats AND bowls may enter this event” is a bound: it does not name a specific player, but it guarantees every entrant has both skills, so the organizer can safely schedule both a batting slot and a bowling slot for them. Without that rule, an entrant might only be a specialist batter, and scheduling a bowling slot for them would fail. A bounded type parameter works the same way: it does not fix one exact type, but guarantees every substituted type has the required capability, so the generic code can safely rely on it.

Step-by-Step Explanation

  1. Step 1

    Identify the required capability

    Decide what method or behavior the generic code actually needs to call on T, e.g. compareTo().

  2. Step 2

    Write the bound

    Declare <T extends Comparable<T>> (or another class/interface) instead of a bare <T>.

  3. Step 3

    Use the guaranteed members

    Inside the generic class or method, call the methods the bound promises exist.

  4. Step 4

    Combine bounds if needed

    Use <T extends Number & Comparable<T>> for multiple bounds, listing at most one class first, then interfaces.

What Interviewer Expects

  • Correct syntax: <T extends Bound> using extends for both classes and interfaces
  • Explanation of why an unbounded T only allows Object methods
  • A concrete example calling a bound-guaranteed method, like compareTo()
  • Awareness of multiple bounds and the PECS rule for bounded wildcards

Common Mistakes

  • Believing extends only works with classes and not interfaces in a bound
  • Forgetting a generic method also needs bracket declaration, e.g. <T extends Comparable<T>> T max(...)
  • Confusing a bounded type parameter with a bounded wildcard (? extends T)
  • Placing an interface bound before a class bound in a multiple-bound declaration (class must come first)

Best Answer (HR Friendly)

A bounded type parameter restricts a generic type to only types that have a certain capability, like being comparable or being a number. This means the generic code can safely call methods that capability guarantees, instead of being limited to just what every object has in common, while still supporting any type that meets the requirement.

Code Example

Bounded type parameter enabling compareTo()
// T must be Comparable to itself so we can call compareTo()
static <T extends Comparable<T>> T max(T a, T b) {
    return a.compareTo(b) >= 0 ? a : b;
}

Integer bigger = max(3, 9);          // works - Integer implements Comparable<Integer>
String later  = max("apple", "kiwi"); // works - String implements Comparable<String>

// Multiple bounds: T must be both Number and Comparable<T>
static <T extends Number & Comparable<T>> T maxNumber(T a, T b) {
    return a.doubleValue() >= b.doubleValue() ? a : b; // Number method usable too
}

Follow-up Questions

  • Why can extends bind a type parameter to an interface, not just a class?
  • What is the difference between a bounded type parameter and a bounded wildcard?
  • What is the PECS rule (Producer Extends, Consumer Super)?
  • What happens if you try to call a non-bound method on an unbounded type parameter?

MCQ Practice

1. What does <T extends Comparable<T>> guarantee about T?

The bound guarantees T implements Comparable<T>, unlocking a safe call to compareTo() inside the generic code.

2. In a multiple bound like <T extends Number & Comparable<T>>, what rule applies?

Java allows at most one class bound, which must appear first, followed by any number of interface bounds joined with &.

3. Without any bound, what can a generic type parameter T be used to call?

An unbounded T is only known to be some Object subtype, so only Object-level methods are callable without a bound.

Flash Cards

Bounded type parameter in one line?A generic type parameter restricted with extends to a class or interface, unlocking its methods.

Syntax?<T extends Upper>, e.g. <T extends Comparable<T>> or <T extends Number>.

Multiple bounds rule?At most one class bound, listed first, then any number of interfaces joined with &.

Without a bound, what can T call?Only Object methods like equals(), hashCode(), toString().

1 / 4

Continue Learning