Object[] objectArray = new Long[1];
objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException
List<Object> objectList = new ArrayList<Long>(); // 호환 불가
objectList.add("타입이 달라 넣을 수 없다.");
- 즉, 컴파일 단계에서만 원소 타입을 검사하며 런타임에는 알 수 조차 없다.
- 소거(erasure)는 제네릭이 지원되기 전의 레거시 코드와 제네릭 타입을 함께 사용할 수 있게 해주는 메커니즘으로 자바5가 제네릭으로 순조롭게 전환될 수 있게 해줬다.
- EX) List<?>와 Map<?,?>
@SafeVarargs
애너테이션으로 대처 가능하다.public class Chooser<T> {
private final Object[] choiceList;
public Chooser(Collection choices) {
choiceaArray = choices.toArray();
}
public Object choose() {
Random rnd = ThreadLocalRandom.current();
return choiceList.[rnd.nextInt(choiceaArray.length)];
}
}
public class Chooser<T>{
private final T[] choiceArray;
public Chooser(Collection<T> choices){
choicesArra = (T[]) choices.toArray();
}
public Object choose(){
Random rnd = ThreadLocalRandom.current();
return choiceArray[rnd.nextInt(choiceArray.length)];
}
}
- 제네릭에서는 원소의 타입 정보가 소거되어 런타임에는 무슨 타입인지 알 수 없음을 기억해야 한다.
- ITEM 27, 비검사 경고를 제거하라
public class Chooser<T> {
private final List<T> choiceList;
public Chooser(Collection<T> choices) {
choiceList = new ArrayList<>(choices);
}
public T choose() {
Random rnd = ThreadLocalRandom.current();
return choiceList.get(rnd.nextInt(choiceList.size()));
}
}
Reference: