예를 들어, 다음과 같은 제네릭 클래스가 있다고 가정해봅시다.
class Box<T> {
private T value;
public void setValue(T value) { this.value = value; }
public T getValue() { return value; }
}
예를 들어, 제네릭 타입으로 배열을 생성하는 코드가 있다고 가정해봅시다.
Box<String>[] boxes = new Box<String>[10]; // 컴파일 오류
Object[] objArray = boxes; // 제네릭 배열을 Object 배열로 캐스팅
objArray[0] = new Box<Integer>(); // 다른 타입의 Box를 넣음
String value = boxes[0].getValue(); // 런타임에서 타입 불일치 오류 발생 가능
제네릭 배열을 직접 생성할 수는 없지만, 몇 가지 우회 방법이 존재합니다.
Object 배열을 생성한 후 캐스팅하기:
@SuppressWarnings("unchecked")
Box<String>[] boxes = (Box<String>[]) new Box[10];
이 방법은 경고를 억제하고, 제네릭 배열을 사용할 수 있게 합니다. 그러나 여전히 타입 안전성을 보장하지 못하므로 조심해야 합니다.
리스트를 사용하기:
자바 컬렉션 프레임워크의 리스트를 사용하는 것이 더 안전한 방법입니다.
List<Box<String>> boxList = new ArrayList<>();
제네릭 타입으로 배열을 생성할 수 없는 이유는 타입 소거로 인해 제네릭 타입의 런타임 타입 정보를 보존할 수 없고, 이로 인해 타입 안전성이 보장되지 않기 때문입니다. 이러한 이유로 자바에서는 제네릭 타입으로 배열을 직접 생성하는 것을 허용하지 않습니다.