본문 바로가기

하../java

ch12 와일드카드 <?> 제네릭메서드

와일드카드 <?>

하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능

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>가능

제네릭 메서드는 메서드를 호출할때마다 타입을 대입해야(대부분 생략가능)

메서드를 호출할때 타입을 생략하지 않을때는 클래스 이름 생략불가.

<Fruit>는 생략된거임

 

'하.. > 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