Open KimYealynn opened 3 years ago
List<E>
)List<E> // E => 정규 타입 매개변수
List<String> // String => 실제 타입 매개변수
List
) => 즉, 제네릭이 아님List<Object>
)
List<?>
)
List.class
(o) vs List<String>.class
o instanceof List
)List<String> // 매개변수화 타입 (+ 실제 타입 매개변수)
List<E> // 제네릭 타입 (+ 정규 타입 매개변수)
List<?>, List<? extends Number> // 비한정적/한정적 와일드카드 타입
List // 로 타입 (제네릭x)
String.class // 타입 토큰
<E> // 정규 타입 매개변수
<String> // 실제 타입 매개변수
<E extends Number> // 한정적 타입 매개변수
<T extends Comparable<T>> // 재귀적 타입 한정
static <E> List<E> asList(E[] a) // 제네릭 메서드
@SuppressWarnings("unchecked")
=> 가능한 좁은 범위에. 주석과 함께p.173
"하지만 (E가 Object가 아닌 한) 배열의 런타임 타입이 컴파일타임 타입과 달라 힙 오염(Heap pollution) 을 일으킨다."<E extends _ >
)T
: 임의의 타입, TypeE
: 컬렉션 원소의 타입, ElementK
: 맵의 KeyV
: 맵의 ValueX
: 예외, eXceptionR
: 메서드의 반환 타입, ReturnT, U, V
, T1, T2, T3
: 임의 타입의 시퀀스 // (2) 반환타입 + 집합의 원소타입 E => (1)로 명시
public static <E> Set<E> union(Set<E> s1, Set<E> s2) { .. }
//(1) 타입매개변수 목록
// (위치는 제한자와 반환타입 사이)
p.177
제네릭 싱글턴 팩터리
private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;
<E extends Comparable<E>>
== "모든 타입 E는 자신과 비교 가능"p.180
"관용구, 와일드 카드를 사용한 변형, 셀프타입 관용구.."
p.20
in item 2)"Iterable<E> // E의 Iterable
Iterable<? extends E> // E의 하위타입의 Iterable
Collection<? super E> // E의 상위타입의 Collection
<? extends T>
<? super T>
Comparable<? super E>
, Comparator<? super E>
는 항상 소비자p.186-7
PECS 적용 예제Union.<Number>union();
매개변수 (parameter) vs 인수 (argument)
void add(int value) {...} // value = 매개변수 (parameter)
add(10); // 10 = 인수 (argument)
class Set
<E>
vs 와일드 카드 <?>
code 28-3
vs code 32-1
@SafeVarargs
static <T> T[] toArray (T... args)
)임의 개수의 원소가 필요한 경우 (ex. db의 column)
모두 Type-safe하려면 컨테이너 대신 키를 매개변수화
public class SampleHaterogeneousContainer {
priavet Map<Class<?>, Object> map = new HashMap<>(); // 키가 비한정적 와일드 카드 (Map이 와일드카드 x)
public <T> void put(Class<T> type, T instance);
public <T> T get(Class<T> type);
}
Class<T>
)
String.class
) => 타입 토큰 (type token) => 키로 사용cast()
)로 관계를 되살릴수 있음 (비검사 형변환 필요 x)한정적 타입 토큰도 사용 가능
// 애너테이션 요소 = 키가 에너테이션 타입인 타입 안전 이종 컨테이너
public <T extends Annotation> T getAnnotation(Class<T> annotationType) {...};
// annotationType => 애너테이션 타입을 뜻하는 한정적 타입 토큰
AnnotatedElement element;
element.getAnnotation(annotateType.asSubclass(Annotation.class));
// asSubclass() : Class<?> => Class<? extends Annotation> 으로 형변환한 것 과 동일
5장 제네릭