E
를 사용한다.
- Object -> E
public class Stack<E> {
private E[] elements;
...
}
E[] elements = new E[DEFAULT_INITAL_CAPACITY]
E[] elements = (E[]) new Object[DEFAULT_INITAL_CAPACITY]
- elements 배열은 private 에 저장된다.
- 클라이언트로 반환되거나 다른 메서드로 전달되는 일이 없다.
- 배열에 저장되는 원소의 타입은 항상 E 이다.
- 배열의 타입을 E[]로 선언하여 오직 E 타입 인스턴스만 받음을 확실히 어필한다.
- 형변환을 배열 생성 시 한 번만 해주면 된다.
- 힙 오염(Heap pollution): JVM의 힙(Heap) 메모리 영역에 저장되어있는 특정 변수(객체)가 불량 데이터를 참조함으로써, 만일 힙에서 데이터를 가져오려고 할때 얘기치 못한 런타임 에러가 발생할 수 있는 오염 상태를 일컫는다.
E result = (E) elements[--size];
- 해당 할당문을 포함한 메소드 전체의 경고를 숨기지 말고 비검사 형변환을 수행하는 할당문에서만 숨긴다.
@SuppressWarning("unchecked") E result = (E) elements[--size];
- 이 때문에 2(2)를 고수하기도 한다.
- HashMap 같은 제네릭 타입은 성능을 높일 목적으로 배열을 사용한다.
O : Stack<Object>, Stack<int[]>, Stack<List<String>>, Stack
X : Stack<int>, Stack<double> // 컴파일 에러 int > Integer, double > Double
class DelayQueue<E extends Delayed> implements BlockingQueue<E>
<E extends Delayed>
는 Delayed 의 하위 타입만 받는다는 뜻이다.
- 모든 타입은 자기 자신의 하위 타입,
DelayQueue<Delayed>
: 사용가능
Reference: