NMP-Study / EffectiveJava2018

Effective Java Study
9 stars 0 forks source link

아이템 29. 이왕이면 제네릭 타입으로 만들라 #29

Closed madplay closed 5 years ago

enochyeon commented 5 years ago

개요


사용하기

타입 매개변수 추가

코드 29-2 제네릭 스택으로 가는 첫 단계 - 컴파일되지 않는다.

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

  public Stack() {
    elements = new E[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; // 다쓴 참조 해제
    return resuilt;
  }

  // 이하 생략
}

해결책 1 - 우회하기

코드 29-3 배열을 사용한 코드를 제네릭으로 만드는 방법 1

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

해결책 2 -필드 타입 변경

private Object[] elements;

29-4 배열을 사용한 코드를 제네릭으로 만드는 방법 2

public E pop() {
  if (size == 0)
    throw new EmptyStackException();

  // push에서 E 타입만 허용하므로 이 형변환은 안전하다
  @SuppressWarnings("unchecked") E result = (E) elements[--size]; // <---

  elements[size] = null; // 다쓴 참조 해제
  return resuilt;
}

정리

class DelayQueue<E extends Delayed> implements BlockingQueue<E>