클래스를 제네릭화하는 첫 번째 단계는 선언부에 형인자를 추가하는 것이다.



 위와 같은 클래스를 만들면 아마 elements = new E[DEFAULT_INITIAL_CAPACITY]; 구분에서 오류가 발생할 것이다. 이는 e 같은 실체화 불가능 자료형으로는 배열을 생성할 수 없기 때문이다. 해결책은 두가지다.
 1. 제네릭 배열을 만들 수 없기 떄문에 우회하는 방법. oBJECT의 배열을 만들어서 제네릭 배열 자료형으로 변환하는 것이다. 이 또한 오류는 없지만 경고메세지가 출력되게 된다. 프로그래머가 형 안전성이 보장된다는 확신하에 @SuppressWarnings("unchecked") 어노테이션을 사용한다.
 2. elements의 자료형을 E[]에서 Object[]로 바꾸는 것이다.  E result = elements[--size] 를 E result = (E) elements(--size)로 바꾸면 오류메세지는 사라지지만 경고메세지가 나타난다. 이 또한 프로그래머가 형변환 안전성이 보장된다는 판단하에 @SuppressWarning("unchecked") 어노테이션으로 처리한다.

 제네릭 배열 생성 오류를 피하는 두 방법 가운데 어떤 것을 쓸지는 대체로 취향 문제다. 그리고 형진자를 제한하는 제네릭 자료형도 있다.
 인자 목록(<E extends Delayed>)을 보면, 실 형인자 E는 반드시 Delayed의 하위 자료형이어야 한다. 따라서 DelayQueue를 구현 할 때나 사용할 때, DelayQueue에 저장되는 원소들을 명시적으로 Delayed 자형으로 변환하거나 ClassCaseException이 발생할 위험을 무릎쓰지 않아도 된다.


요약

제네릭 자료형은 클라이언트가 형변환을 해야만 사용할 수 있는 자료형보다 안전할 뿐 아니라 사용하기도 쉽다. 새롱누 자료형을 설계할 때는 형번환 없이도 사용할 수 있도록 하라. 


+ Recent posts