public static <T> T genericMethod(T t) {
System.out.println("generic print: " + t);
return t;
}
public static <T extends Number> T numberMethod(T t) {
System.out.println("bound print: " + t);
return t;
}
Integer integer = GenericMethod.<Integer>genericMethod(i);
Integer integer2 = GenericMethod.numberMethod(10);
public class ComplexBox <T extends Animal>{
private T animal;
public void set(T animal) {
this.animal = animal;
}
public <T> T printAndReturn(T t){
System.out.println("animal.className = " + animal.getClass().getName());
System.out.println("t.className :" + t.getClass().getName());
return t;
}
}
public static void main(String[] args) {
Dog dog = new Dog("멍멍이", 100);
Cat cat = new Cat("냐옹이", 50);
ComplexBox<Dog> hospital = new ComplexBox<>();
hospital.set(dog);
// Generic 타입보다 Generic 메서드가 더 높은 우선순위를 가진다.
// 프로그래밍에서는 가까운거 좀 더 구체적인게 우선순위가 높다.
Cat returnCat = hospital.printAndReturn(cat);
System.out.println("returnCat = " + returnCat);
}

static <T> void printGenericV1(Box<T> box) {
System.out.println("T = " + box.get());
}
// 와일드 카드
static void printWildcardV1(Box<?> box) {
System.out.println("? = " + box.get());
}
? == <? extends Object>와 의미가 같다.printGenericV1(Box<T> box)는 타입 매개변수가 존재하며, 호출 시점에 타입 인자를 전달 받아 타입을 결정하는 복잡한 과정이 있다. 그러나 printWildcardV1(Box<?> box)를 사용하면, 와일드 카드는 일반적인 메서드에서도 사용 할 수 있고, 단순히 매개변수로 Generic타입을 받는 것 뿐이기 때문에 타입을 결정하는 복잡한 과정이 작동하지 않는다. 즉, 단순히 매개변수로 Generic 타입을 사용하는 일반적인 메서드라는 것이다. static Animal printAndReturnWildcard(Box<? extends Animal> box) {
Animal animal = box.get();
System.out.println("이름 = " + animal.getName());
return animal;
}
위의 코드와 같이 Box<? extends Animal> box같이 표현하고, 매개변수 타입 범위를 Animal 클래스 포함 그 자식들까지만 들어올 수 있다라고 제한한다. 즉, 최고 기준을 Animal 타입으로 설정한 것이다.
여기서 살펴봐야할 것은 box.get()의 반환타입인데, Generic Method와 다르게 반환 타입이 범위 기준 가장 최상위 클래스 타입으로 반환하는 것을 알 수 있다.
두 번째로, 하한 경계에 대해서 살펴보자.
static Animal printAndReturnWildcard(Box<? super Animal> box) {
Object animal = box.get();
return animal;
}
Box<? super Animal> box같이 표현하고, 매개변수 타입 범위를 Animal 클래스 포함 타입 중 최상위인 Object까지 들어올 수 있다라고 제한한다. 즉, 최소 기준을 Animal 타입으로 설정한 것이다.