Tutorials :Flexible Object Operation with Java Generics :

The Big Bang of Java Generics

The big bang of Java Generics started with a trivial example implying a container type. The example below is from that category of examples. It's simple routine creates a LinkedList collection and displays the collection's first element:
1: import java.util.List;
2: import java.util.LinkedList;

3: class WithoutGenerics {    
4:    public static void main(String[] args) {   
5:    List floatList=new LinkedList();    
6:    floatList.add(new Float(4.5));    
7:    floatList.add(new Float(1.5));
8:    Float nr=(Float)(floatList.iterator().next());
9:    
10:    System.out.println("First float number: "+nr);
11:    }
12: }
This is a correct example--meaning, it will compile and run perfectly and will display the first element of the floatList list. But let’s modify it by replacing the line 9:
9: String str=(String)(floatList.iterator().next());
With this modification, the example code will compile without errors, but will not run correctly. Instead, it throws a java.lang.ClassCastException exception. The exception is fully covered because you cannot cast a Float to a String!

Now you have a dilemma, because it's obvious that the casts from lines 8 and 9 are annoying. Firstly, you know what types of objects you have stored in the list, so why should you write an explicit cast when accessing the list s elements? Secondly, when you accidentally/intentionally mistake the cast type, why you do not get a compile-time error or at least a warning about this problem? Both questions have the same answer: Because Java Collection classes internally treat elements in the collection as Objects.

This problem is responsible for the birth of the Java Generics core idea, which goed like this: What if a developer could indicate the particular data type to be stored in a list? The practical application of this theoretical concept is to use angle brackets, shown in line 5 in the below example (which is the Java Generics version of the previous code):

1: import java.util.List;
2: import java.util.LinkedList;

3: class WithGenerics {    
4: public static void main(String[] args) {
5:    List floatList = new LinkedList();
6:    floatList.add(new Float(4.5));    
7:    floatList.add(new Float(1.5));
8:    Float nr=floatList.iterator().next();
9:    
10:   System.out.println("First float number: "+nr);
11:   }
12: } 
Now, your list is a list of Floats—you have specified this by explicitly placing the <Float> indicator at line 5. Thanks to this important modification, you no longer need the explicit cast from line 8; in this case, the List is a generic interface that accepts a type parameter, which, in this example, is Float. In any case, using the cast from line 8 in these conditions is not an error, it's an unjustified action.

Now, modify the example by replacing line 9:

9: String str=(String)(floatList.iterator().next());
The example will no longer compile successfully and a very explicit inconvertible types error will be reported. Cool!

Home / Articles / Flexible Object Operation with Java Generics / 1 / 2 / Next: Java Generics and Subtyping

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.