The advantage of using generic type is the object type is checked in compile time. A class that is designed to handle object with type A will not be mistakenly passed an object with Type B
Suppose we define a Container to store and retrieve an object. In order to know what type of object we will put later, we add type parameter T.
public interface Container<T> {
public void set(T t);
public T get();
}
and we have fruits Apple and Orange that will be put the in container
public class Apple {
private String label;
public Apple(String label) {
super();
this.label = label;
}
@Override
public String toString() {
return "Apple [label=" + label + "]";
}
}
public class Orange {
private String label;
public Orange(String label) {
super();
this.label = label;
}
@Override
public String toString() {
return "Orange [label=" + label + "]";
}
}
A box that implements Container will be used to put Apple or Orange
public class Boximplements Container<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } }
To create a box that can have Apple only
Box<Apple> genericAppleBox = new Box<Apple>();
A box that can have Orange only
Box<Orange> genericOrangeBox = new Box<Orange>();
If we try to put an Orange in the apple box,
genericAppleBox.set(orange);
the compiler will complain, "The method set(Apple) in the type Box
The type parameter also can be specified in the class definition
To declare a box class that will store Apple only
public class AppleBox implements Container<Apple> {
private Apple apple;
public Apple get() {
return apple;
}
public void set(Apple apple) {
this.apple = apple;
}
}
A box will will store Orange only
public class OrangeBox implements Container<Orange> {
private Orange orange;
public Orange get() {
return orange;
}
public void set(Orange orange) {
this.orange = orange;
}
}
To create the box for Apple only
AppleBox specificAppleBox = new AppleBox();
To create the box for Orange only
OrangeBox specificOrangeBox = new OrangeBox();
If we try to put an Orange to the Apple box,
specificAppleBox.set(orange);
the compiler will complain, "The method set(Apple) in the type AppleBox is not applicable for the arguments (Orange)"
Reference
http://docs.oracle.com/javase/tutorial/java/generics/