static <T extends Animal> void printGenericV2(Box<T> box) {
T t = box.get();
System.out.println("이름 = " + t.getName()); }
static void printWildcardV2(Box<? extends Animal> box) { Animal animal = box.get();
System.out.println("이름 = " + animal.getName());
}
와일드 카드는 제네릭을 정의할 때 사용하는 것이 아니다.
타입인자가 전달된 제네릭 타입을 활용할 때 사용한다.
static <T extends Animal> T printAndReturnGeneric(Box<T> box) {
T t = box.get();
System.out.println("이름 = " + t.getName());
return t; }
static Animal printAndReturnWildcard(Box<? extends Animal> box) { Animal animal = box.get();
System.out.println("이름 = " + animal.getName());
return animal;
}
와일드카드는 새로운 타입 매개변수를 정의하지 않는다.
따라서 전달된 타입을 그대로 반환하거나 타입 정보를 유지해야 하는 경우에는 제네릭 메서드를 사용해야 한다.
쉽게 이야기 해서 일반적인 메서드를 사용한다고 보면 된다.
와일드 카드는 상한 뿐만 아니라 하한도 존재한다.
package generic.test.ex5;
import generic.animal.Animal;
import generic.animal.Cat;
import generic.animal.Dog;
public class WhildcardMain2 {
public static void main(String[] args) {
Box<Object> objectBox = new Box<>();
Box<Animal> animalBox = new Box<>();
Box<Dog> dogBox = new Box<>();
Box<Cat> catBox = new Box<>();
// Animal포함 상위 타입 전달 가능
writeBox(objectBox);
writeBox(animalBox);
Animal animal = animalBox.get();
System.out.println("animal = " + animal);
}
// 최소환 Animal부터
public static void writeBox(Box<? super Animal> box) {
box.set(new Dog("멍멍이", 100));
}
}
하한 와일드카드는 특정 타입과 그 부모 타입만 허용한다.
주로 데이터를 저장(Write)할 때 사용한다.