NMP-Study / EffectiveJava2022

Effective Java Study 2022
5 stars 0 forks source link

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

Closed okhee closed 2 years ago

RulLu16 commented 2 years ago

개요


사용하기

타입 매개변수 추가

제네릭 스택으로 가는 첫 단계! - 하지만 컴파일되지 않는다.

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]; // <--- 실체화 불가타입인 E로는 배열을 만들 수 없어, 오류 발생!
  }

  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 - 대놓고 우회하기

Object 배열을 생성한 다음, 제네릭 배열로 형변환

public Stack() {
    elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
  }

안전하다면? -> 경고 숨겨서 사용하기(#27)

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

해결책 2 -필드 타입 변경

private Object[] elements;

필드타입을 Object[]로 변경하고, 배열이 반환한 원소를 E로 형변환

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

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

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

이외 제네릭 사용법 등