클래스를 제네릭화하는 첫 번째 단계는 선언부에 형인자를 추가하는 것이다.
위와 같은 클래스를 만들면 아마 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이 발생할 위험을 무릎쓰지 않아도 된다.
요약
제네릭 자료형은 클라이언트가 형변환을 해야만 사용할 수 있는 자료형보다 안전할 뿐 아니라 사용하기도 쉽다. 새롱누 자료형을 설계할 때는 형번환 없이도 사용할 수 있도록 하라.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[제네릭]규칙28. 한정적 와일드카드를 써서 API유연성을 높여라 (0) | 2017.05.03 |
---|---|
[제네릭]규칙27.가능하면 제네릭 메서드로 만들 것 (0) | 2017.05.03 |
[제네릭]규칙25. 배열대신 리스트를 써라 (0) | 2017.04.29 |
[제네릭]규칙24. 무점검 경고를 제거하라 (0) | 2017.04.27 |
[제네릭]규칙23. 새 코드에는 무인자 제네릭 자료형을 사용하지마라. (0) | 2017.04.27 |