<이펙티브 자바> 5. 제네릭
by BFine반응형
www.yes24.com/Product/Goods/65551284
5장
- 제네릭을 지원하기전 컬렉션에서 객체를 꺼낼때마다 형변환 문제
- 지원 후에 컴파일 과정에서 차단
26. 로 타입은 사용하지 말자
-
로타입이란 제네릭에서 타입 매개변수를 사용하지 않는 것
-
로타입은 안정성, 표현력 모두 잃는다
-
List
-
와일드카드(<?>)
-
Collection<?>에는 null 외에 어떤 원소도 넣을 수 없다.
public static <E extends SKT> void test(List<E> a){ a.add((E) new SKP()); } public static void test2(List<? extends SKT> a){ a.add(new SKP()); // 컴파일오류 }
-
27. Warnning을 제거하자
- javac 인수로 -Xlint:uncheck 옵션을 추가 하면 컴파일러가 알려준다
- 타입 안전하다고 확식하면 @SuppressWarnings 를 달아 표시하자(좁은 범위로 사용)
- 사용하고 왜 안전한지 주석으로 남겨라
28. 배열보다는 리스트 사용하자
- 차이점
- 배열은 함께 변한다. (sub extends super 이면 super[]는 sub[] 상위 타입이 된다)
- List
- 제네릭은 배열을 허용하지 않는다
ArrayList<String> list[] = new ArrayList<String>[3]
컴파일 오류!
29. 이왕이면 제네릭 타입으로 만들자
- E[] 처럼 제네릭 배열은 실체화가 불가능 하다.
Object[] element = new E[3](x), (E[]) new Objcet[3] (o)
30. 이왕이면 제네릭 메서드로 만들자
-
제네릭 메서드를 쓸경우 메서드에 를 써줘야한다.
-
예시
public static void main(String[] args) { List<SKB> skbs = new ArrayList<>(); List<SKP> skps = new ArrayList<>(); union(skbs); union(skps); } public static <E extends SKT> List<E> union(List<E> a){...} public static <E extends SKT> List<E> union(List<E> a, List<E> b){...}
-
-
표식으로 사용할 수 도 있다.
<E extends Comparable<E>>는 모든 타입 E는 자신과 비교 할 수 있다.
31. 한정적 와일드 카드를 사용해 API 유연성을 높이자
- 유연성을 극대화하려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하자.
- T가 생산자라면 extends T, 소비자면 super T
32. 제네릭과 가변인수를 함께 쓸때는 신중하자
-
가변인수(varargs)는 메서드에 넘기는 인수의 개수를 클라이언트가 조절 할 수 있게 한다
public void varargs(String ... params)
배열형태로 사용가능하다.
-
List ... 처럼 사용시 타입 안전성이 깨진다
-
@SafeVarargs 는 타입 안정성을 보장하는 장치
-
가변인수 메서드를 호출할때 제네릭 배열이 만들어진다.
33. 타입 안전 이종 컨테이너를 고려하라
반응형
'개발서적 > 이펙티브 자바' 카테고리의 다른 글
<이펙티브 자바> 7. 람다와 스트림 (0) | 2021.01.17 |
---|---|
<이펙티브 자바> 6. 열거 타입과 애너테이션 (0) | 2021.01.15 |
<이펙티브 자바> 4. 클래스와 인터페이스 (0) | 2021.01.12 |
<이펙티브 자바> 3. 모든 객체의 공통 메서드 (0) | 2021.01.11 |
<이펙티브 자바> 2. 객체 생성과 파괴 (0) | 2021.01.10 |
블로그의 정보
57개월 BackEnd
BFine