Concept of generics

Java generics allows the creation of a class or a method that can be reused by different data types or objects. This reduces the need for the same implementation throughout the code.

Another advantage is that the error checks are performed during the compile time, removing the possibility of runtime errors.

The class or a method denoted by <T> is recognized as a generic, where T is a type of parameter. In order to differentiate types of parameters from ordinary classes, single, uppercase letters are used.

Unbounded type parameters

Let’s create a simple generic class which prints out the value that was previously set:

public class Demo<T> {
   private T value;

   public void setValue(T value) {
      this.value = value;

   public void printValue() {

We can instantiate this class with the following:

Demo<String> onlyString = new Demo<>;
Demo<Integer> onlyInteger = new Demo<>;

and set the values:


If we try to do something like this, we will get a compilation error:


Now we can print out the values for both data types, by calling the same method from our generic class:

onlyString.printValue();  // “Hello”
onlyInteger.printValue(); // 1

Bounded parameter types

What if we want to limit classes that can be instantiated from our generic class? This can be achieved with a super keyword for lower, and extends for upper bounds.

Imagine having a hierarchy of classes:

public class Animal { }
public class Bird extends Animal { }
public class Eagle extends Bird { }

To create a generic class with bounded parameters we can do one of the following:

<T extends Animal> any class that is extended from the Animal, i.e Bird and Eagle

<T super Bird>superclasses of the Bird, i.e Animal, Object

“JAVA Generics” Tech Bite was brought to you by Nizam Alešević, Junior Software Engineer at Atlantbh.

Tech Bites are tips, tricks, snippets or explanations about various programming technologies and paradigms, which can help engineers with their everyday job.

Software DevelopmentTech Bites
February 23, 2024

Background Jobs in Elixir – Oban

When and why do we need background jobs? Nowadays, background job processing is indispensable in the world of web development. The need for background jobs stems from the fact that synchronous execution of time-consuming and resource-intensive tasks would heavily impact an application's  performance and user experience.  Even though Elixir is…

Want to discuss this in relation to your project? Get in touch:

Leave a Reply