728x90
- 배열은 불안정 할 수 있다.
- 배열과 제네릭에는 매우 다른 타입 규칙이 적용된다.
- 배열은 공변이고 실체화되는 반면, 제네릭은 불공변이고 타입 정보도 소거된다.
- 둘을 섞어 쓰다가 컴파일 오류나 경고를 만나면, 가장 먼저 배열을 리스트로 대체하는 방법을 적용해보자.
//공변
Object[] objects = new Long[1];
objects[0] = "타입이 달라 넣을 수 없다.";
//불공변
List<Object> o1 = new ArrayList<Long>(); //호환되지 않는 타입이다.
o1.add("타입이 달라 넣을 수 없다.");
- 배열은 런타임때 에러가 발생하고, 리스트를 사용하면 컴파일 시 바로 알 수 있다.
- 제네렉은 타입 정보가 런타임에는 소거된다.
- 이는 자바 5버전 이전의 하위호환 떄문에 컴파일러가 List<String> 이라는걸 바이트 코드로 변경할때 String 부분을 Object 으로 변경하고, 기존 List<String> 이라 적은 부분으로, 값을 깨낼때 캐스팅을 유추하여 값을 꺼낸다.
- 가변인자(varargs) 를 사용할시 경고가 뜰 수 있는데 이는 @SafeVarargs 어노테이션으로 무시할 수있지만 정말 이 값으로 단순한 작업을 할대만 사용하는것이 좋을듯 싶다.
728x90
'공부 > 이펙티브자바' 카테고리의 다른 글
[이펙티브자바]item 30.이왕이면 제네릭 메서드로 만들라. (0) | 2023.02.14 |
---|---|
[이펙티브자바]item 29.이왕이면 제네릭 타입으로 만들라. (0) | 2023.02.13 |
[이펙티브자바]item 27.비검사 경고를 제거하라 (0) | 2023.02.10 |
[이펙티브자바]item 26.로 타입은 사용하지 말라 (0) | 2023.02.10 |
[이펙티브자바]item 25.톱레벨 클래스는 한 파일에 하나만 담으라. (0) | 2023.02.08 |
댓글