Overriding Methods in Generic Class

Overriding in Java refers to redefining a superclass method in a subclass. When using generics, overriding still follows the same rules, but type parameters can add flexibility or complexity.

Generic classes can:

  • Inherit from other generic or non-generic classes
  • Override methods with or without type parameters
  • Add constraints via bounded types

Syntax

class SuperClass<T> {
    public void display(T value) {
        System.out.println("Super: " + value);
    }
}

class SubClass<T> extends SuperClass<T> {
    @Override
    public void display(T value) {
        System.out.println("Sub: " + value);
    }
}Code language: JavaScript (javascript)

Program

class Printer<T> {
    public void print(T value) {
        System.out.println("Printer prints: " + value);
    }
}

class FancyPrinter<T> extends Printer<T> {
    @Override
    public void print(T value) {
        System.out.println("FancyPrinter prints *** " + value + " ***");
    }
}

public class Demo {
    public static void main(String[] args) {
        FancyPrinter<String> printer = new FancyPrinter<>();
        printer.print("LotusJavaPrince");
    }
}
/*
FancyPrinter prints *** LotusJavaPrince *** 
*/

Overriding With Bounded Type Parameters

class Calculator<T extends Number> {
    public double square(T value) {
        return value.doubleValue() * value.doubleValue();
    }
}

class AdvancedCalculator<T extends Number> extends Calculator<T> {
    @Override
    public double square(T value) {
        System.out.println("Advanced squaring: " + value);
        return super.square(value);
    }
}

public class MathTest {
    public static void main(String[] args) {
        AdvancedCalculator<Integer> calc = new AdvancedCalculator<>();
        System.out.println("Result: " + calc.square(5));
    }
}
/*
Advanced squaring: 5
Result: 25.0
*/

Non-Generic Subclass Overriding Generic Method

class Employee<T> {
    public void show(T id) {
        System.out.println("Employee ID: " + id);
    }
}

class PermanentEmployee extends Employee<String> {
    @Override
    public void show(String id) {
        System.out.println("Permanent Employee ID: " + id);
    }
}

public class TestEmp {
    public static void main(String[] args) {
        PermanentEmployee pe = new PermanentEmployee();
        pe.show("EMP2025");
    }
}
/*
Permanent Employee ID: EMP2025
*/

5. Overriding Methods with Wildcards !!

You cannot override a method using a wildcard (like <?>) in place of a type parameter.

class Container<T> {
    public void addItem(T item) { }
}

// Invalid: can't override using wildcard
// class NewContainer<T> extends Container<T> {
//     public void addItem(?) { }  // Not allowed Compile Time Error
// }

Real-World Example: Bank Account

class Account<T> {
    public void process(T details) {
        System.out.println("Processing account: " + details);
    }
}

class SavingsAccount extends Account<String> {
    @Override
    public void process(String details) {
        System.out.println("Savings Account processed for: " + details);
    }
}

public class BankSystem {
    public static void main(String[] args) {
        SavingsAccount acc = new SavingsAccount();
        acc.process("LotusJavaPrince");
    }
}
/*
Savings Account processed for: LotusJavaPrince
*/
Scroll to Top