리스트와 같은 다양한 종류의 데이터를 사용하는 경우 데이터의 타입을 특정 타입으로 고정할 수 있다.
제네릭은 특정 타입으로 제한함으로써 타입 안정성을 제공한다. 또 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결해진다.
ArrayList values = new ArrayList();
values.add("this is string");
values.add(1);
values.add(new Position(1, 2));
String first = (String) values.get(0);
int second = (int) values.get(1);
Position third = (Position) values.get(2);
제네릭을 사용하지 않을 경우 다양한 객체의 타입을 사용할 수 있다. 그러나 이 형태는 런타임에 문제가 발생하는 여지가 발생한다. 이를 컴파일 타임에 검증을 하기 위해 컴파일 타임에 타입 검증을 할 수 있는 제네릭이 등장했다.
ArrayList<String> values = new ArrayList<String>();
values.add("first");
values.add("second");
String first = values.get(0);
String second = values.get(1);
따라서 다음과 같이 <>를 사용해 ArrayList가 관리하는 타입을 지정한다. 이를 통해 해당 타입만 제한해 추가할 수 있고, 다른 타입을 저장하면 컴파일 에러가 발생한다.
ArrayList list = new ArrayList();
list.add("some");
int s = (int) list.get.(0)
위와 같이 잘못 캐스팅을 한 경우, 컴파일에서 체크할 수 없고 런타임에서만 문제를 발견할 수 있다.
따라서 컴파일 타임에 잘못된 캐스팅을 체크할 수 있는 제네릭은 안정성을 올려준다고 할 수 있다.