// 제네릭 클래스 선언
public class Box<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
// 사용
Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
System.out.println(stringBox.getItem()); // 출력: Hello
// 제네릭 메서드 선언
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.print(item + " ");
}
}
// 사용
Integer[] intArray = {1, 2, 3};
String[] strArray = {"A", "B", "C"};
printArray(intArray); // 출력: 1 2 3
printArray(strArray); // 출력: A B C
// 제네릭 인터페이스 선언
public interface Pair<K, V> {
K getKey();
V getValue();
}
// 구현 클래스
class KeyValue<K, V> implements Pair<K, V> {
private K key;
private V value;
public KeyValue(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
// 사용
Pair<Integer, String> pair = new KeyValue<>(1, "One");
System.out.println(pair.getKey() + ": " + pair.getValue()); // 출력: 1: One
// Number 클래스와 그 하위 클래스만 허용
public class Calculator<T extends Number> {
public double square(T number) {
return number.doubleValue() * number.doubleValue();
}
}
// 사용
Calculator<Integer> calc = new Calculator<>();
System.out.println(calc.square(5)); // 출력: 25.0
public static void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
// 사용
List<String> stringList = List.of("A", "B", "C");
printList(stringList); // 출력: A B C
기본 타입 사용 불가:
int, double 같은 기본 타입 사용 불가.Integer, Double) 사용.List<int> list = new ArrayList<>(); // 컴파일 에러
List<Integer> list = new ArrayList<>(); // 올바름
정적 변수와 함께 사용 불가:
public class GenericClass<T> {
private static T value; // 컴파일 에러
}
런타임 시 타입 소거(Type Erasure):
List<String> stringList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
System.out.println(stringList.getClass() == intList.getClass()); // 출력: true
List, Set, Map 등.Optional, Comparator, Stream API 등.