일반 클래스를 제네릭 클래스로 만드는 방법

  1. 클래스 선언에 타입 매개변수 추가 (보통 E)
  2. 코드에 쓰인 Object를 적절한 타입 매개변수로 바꾸고 컴파일해 나타나는 오류 해결

배열 사용하는 코드를 제네릭으로 만드는 방법

E와 같은 실체화 불가 타입으로는 배열을 만들 수 없다. 이 문제를 해결할 수 있는 두가지 방법이 있다. 두 방법 모두 사용하지만 현업에서는 첫 번째 방법을 더 선호하고 자주 사용한다.

1. Object 배열을 생성한 후에 제네릭 배열로 형변환

public class Stack<E> {
    private E[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    @SuppressWarnings("unchecked")
    public Stack() {
        elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(E e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public E pop() {
        if (size == 0)
            throw new EmptyStackException();
        E result = elements[--size];
        elements[size] = null; // Eliminate obsolete reference
        return result;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }

    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        for (String arg : args)
            stack.push(arg);
        while (!stack.isEmpty())
            System.out.println(stack.pop().toUpperCase());
    }
}

2. elements 필드의 타입을 E[]에서 Object[]로 바꾸기