와일드카드 <?>
하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
ArrayList<? extends Product> list = new ArrayList<Tv>(); //불일치 해도 Ok
ArrayList<? extends Product> list = new ArrayList<Audio>(); // 불일치 해도 ok
ArrayList<Product> list = new ArrayList<Tv>(); //에러 타입 불일치
<? extends T> 와일드 카드의 상한 제한 T와 그 자손들만 가능
<? super T> 와일드 카드의 하한 제한 T와 그 조상들만 가능
<?> 제한 없음 모든 타입이 가능<? extends Object>와 동일
- 메서드의 매개변수에 와일드 카드를 사용
static Juice makeJuice(FruitBox<? extends Fruit> Box){
String temp = "";
for(Fruit f : box.getList()) tmp += f + " ";
return new Juice(tmp)
System.out.println(Juicer.makeJuice(new FruitBox<Fruit>())); 사용가능
System.out.println(Juicer.makeJuice(new FruitBox<Apple>())); 사용가능
}
제네릭 메서드
제네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
static <T> void sort(List<T> list, Comparator<? super T> c)
클래스의 타입 매개변수<T>와 메서드의 타입 매개변수 <T>는 별개
class FruitBox<T>{
static <T> void sort(List<T> list, Comparator<? super T> c{
}
}
클래스<T>와 메서드<T>는 다른 타입변수 클래스에는<String> 메서드에는 <Integer>가능
제네릭 메서드는 메서드를 호출할때마다 타입을 대입해야(대부분 생략가능)
메서드를 호출할때 타입을 생략하지 않을때는 클래스 이름 생략불가.

'하.. > java' 카테고리의 다른 글
| ch13 싱글 스레드와 멀티 스레드 스레드의 i/o블로킹 (0) | 2021.12.24 |
|---|---|
| ch13 프로세스와 쓰레드 (0) | 2021.12.24 |
| ch12 제한된 제네릭 클래스 (0) | 2021.12.24 |
| ch 12 Iterator<E> (0) | 2021.12.24 |
| ch12 제네릭스 용어 (0) | 2021.12.24 |