Generic Class Hierarchies

A generic class hierarchy is when a generic class is extended by another class (which can be generic or non-generic). Java allows:

  • A generic class to extend another generic class.

  • A generic class to extend a non-generic class.

  • A non-generic class to extend a generic class.

This promotes code reuse, type safety, and flexibility in inheritance.

Syntax of a Generic Class Hierarchy

class Parent<T> {
    // generic parent class
}

class Child<T> extends Parent<T> {
    // inherits generic type
}Code language: JavaScript (javascript)

You can also define a child with different or additional type parameters:

class Child<T, U> extends Parent<T> {
    // T comes from Parent, U is new
}Code language: JavaScript (javascript)

Program-1:Simple Generic Inheritance

class Box<T> {
    protected T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

class ColorBox<T> extends Box<T> {
    private String color;

    public void setColor(String color) {
        this.color = color;
    }

    public String getColor() {
        return color;
    }
}

public class Test {
    public static void main(String[] args) {
        ColorBox<String> cb = new ColorBox<>();
        cb.setItem("LotusJavaPrince");
        cb.setColor("Blue");

        System.out.println(cb.getItem() + " and " + cb.getColor() + " box.");
    }
}
/*
LotusJavaPrince in and box.
*/

Program-2: Generic Subclass with Multiple Parameters

class Pair<K, V> {
    K key;
    V value;

    public void set(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public String getDetails() {
        return "Key: " + key + ", Value: " + value;
    }
}

class ExtendedPair<K, V, T> extends Pair<K, V> {
    T extra;

    public void setExtra(T extra) {
        this.extra = extra;
    }

    public String getAllDetails() {
        return getDetails() + ", Extra: " + extra;
    }
}

public class TestHierarchy {
    public static void main(String[] args) {
        ExtendedPair<String, Integer, String> ep = new ExtendedPair<>();
        ep.set("Mahesh", 101);
        ep.setExtra("Manager");

        System.out.println(ep.getAllDetails());
    }
}

/*
Key: Mahesh, Value: 101, Extra: Manager
*/

Example 3: Non-Generic Subclass Extending a Generic Class

class GenericEmployee<T> {
    T id;

    public void setId(T id) {
        this.id = id;
    }

    public T getId() {
        return id;
    }
}

// Non-generic subclass fixes the type
class StringEmployee extends GenericEmployee<String> {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void showInfo() {
        System.out.println("Name: " + name + ", ID: " + getId());
    }
}

public class EmployeeTest {
    public static void main(String[] args) {
        StringEmployee emp = new StringEmployee();
        emp.setName("LotusJavaPrince");
        emp.setId("EMP123");
        emp.showInfo();
    }
}

/*
Name: LotusJavaPrince, ID: EMP123
*/

Program-4: Generic Class Extending a Non-Generic Class

class Department {
    String deptName;

    public Department(String name) {
        this.deptName = name;
    }

    public String getDeptName() {
        return deptName;
    }
}

class Employee<T> extends Department {
    private T empId;

    public Employee(String dept, T empId) {
        super(dept);
        this.empId = empId;
    }

    public void show() {
        System.out.println("Department: " + getDeptName() + ", ID: " + empId);
    }
}

public class Demo {
    public static void main(String[] args) {
        Employee<Integer> emp = new Employee<>("Finance", 2025);
        emp.show();
    }
}
/*
Department: Finance, ID: 2025
*/

Generic class hierarchies:

  • Support flexible inheritance

  • Promote code reuse with type safety

  • Can involve same or new type parameters in child classes

  • Allow non-generic subclasses to fix generic types


Scroll to Top