In this post we are going to talk about one of Java programming language feature called as generics. Generics is a feature introduced in JDK 5.0. The generics feature allow you to abstract over types. What does it mean? It means that you can create a class or method that can work for a type assigned to it. You’ll see a lot of use of generics when you are working with Java Collections. But of course generics can be used for doing other things in you program.
To illustrate this feature let us begin by creating a code when the generics are not yet available in Java to see what problem it is trying to solve.
List data = new ArrayList(); data.add("John Doe"); String name = (String) data.get(0);
Here are the things we can see from the code above. First we create an
ArrayList and call it
data. This variable actually can hold any Java objects in it. On the second line we add a string to this list. And finally on the third line we get the data back from the list. One thing you see here is that you need to cast the object read out from the list. Because the list doesn’t know what type to return other than
If you look to the definition of the List’s
get() method prior to JDK 5.0 you’ll see that the
add() method will accept
Object as argument and the
get() method also returns
Now, let say your friend try to use your class, and he tries to add another object the list. He adds the following lines.
data.add(new Date()); String name = (String) data.get(0);
This code will actually compile just fine. The
add() method will work because
Object. And the
get() method will also compile without any error. But when we execute the program we will get a runtime error saying that it cannot cast a
Date object into type of
Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String
So how do you protect your friend from making this mistake? You can use generics. You can tell what the list should store by defining the type for the list. This way you will get a compiled time check to make sure that you are adding the correct data to the list. So, your code will look like the following.
List<String> data = new ArrayList<String>(); data.add("John Doe"); String name = data.get(0);
In this generic version of the code snippet you see that now we declare the list to store an object of type
String. If you tried to add a
Date into the list you’ll get a compiled time error. Your IDE will mark the line as error. The other benefit is that you don’t have to do the cast anymore. Generics reduce the clutters in your code by removing the unwanted cast operator from your code.
Actually if you are working on the JDK 7, you can simplify the variable declaration using diamond operator. So you can write it like.
List<String> data = new ArrayList<>();
I hope this will give you the basic understanding of generics and how to use it in your day-to-day working with your Java projects.
- How do I convert Map to JSON and vice versa using Jackson? - June 12, 2022
- How do I find Java version? - March 21, 2022
- How do I convert CSV to JSON string using Jackson? - February 13, 2022