• 로 타입: List
• 제네릭 타입: List<E>
• 매개변수화 타입: List<String>
• 타입 매개변수: E
• 실제 타입 매개변수: String
• 한정적 타입 매개변수: List<E extends Number>
• 비한정적 와일드카드 타입: Class<?>
• 한정적 와일드카드 타입: Class<? extends Annotation>
public class GenericBasic {
public static void main(String[] args) {
// Generic 사용하기 전 - row anti pattern
List numbers = new ArrayList();
numbers.add(10);
numbers.add("whiteship");
for (Object number: numbers) {
System.out.println((Integer)number);
}
// Generic 등장 이후
List<Integer> nuberms = new ArrayList<>();
nuberms.add(10);
nuberms.add("whiteship");
for (Integer number: nuberms) {
System.out.println(number);
}
}
}
---
public class Box<E> {
private E item;
private void add(E e) {
this.item = e;
}
private E get() {
return this.item;
}
public static void main(String[] args) {
Box<Integer> box = new Box<>();
box.add(10);
System.out.println(box.get() * 100);
printBox(box);
}
**private static void printBox(Box<?> box)** { // 안전한 코드
System.out.println(box.get());
}
}
런타임이 아닌 컴파일 타임에 문제를 찾을 수 있다. (안정성)
제네릭을 활용하면 이 정보가 주석이 아닌 타입 선언 자체에 녹아든다. (표현력)
“로 타입”을 사용하면 안정성과 표현력을 잃는다.
그렇다면 자바는 “로 타입”을 왜 지원하는가?
List와 List<Object>의 차이는?
Set과 Set<?>의 차이는?