1. 기본 Generic의 한계
- Generic 타입을 학습하고 나면, 아래 코드도 가능 할거라고 생각 할 수 있다.
public class Temp<T> {
private T animal;
public void set(T animal) {
this.animal = animal;
}
public void checkUp() {
System.out.println("동물 이름: " + animal.getName());
System.out.println("동물 크기: " + animal.getSize());
animal.sound();
}
public T bigger(T target) {
return animal.getSize() > target.getSize() ? animal : target;
}
}
- Animal이라는 타입이 들어와서 그 타입의 메서드를 사용할 수 있을거라고 생각하고 작성했지만, 자바 컴파일러는 정보가 없기 때문에 최상위 타입인 object로 가정을 하고 object 클래스 관련 메서드만 사용할 수 있다. 뿐만 아니라, 전혀 관계 Object로 인식하기 때문에 전혀 관계가 없는 타입들도 인자로 전달 할 수 있다는 문제가 있다.
- 즉, 최소한의 타입 인자 클래스를 정의해야만 우리가 생각했던 방식으로 작동한다.
2. Generic의 매개변수 제한
- 위와 같은 문제를 해결하기 위해, 아래와 같이 타입 매개 변수를 특정 타입으로 제한 할 수 있다.
public class Temp2<T extends Animal> {
private T animal;
public void set(T animal) {
this.animal = animal;
}
public void checkUp() {
System.out.println("동물 이름: " + animal.getName());
System.out.println("동물 크기: " + animal.getSize());
animal.sound();
}
}
<T extends Animal> 형태로 작성하며, Animal을 포함하여, 그 자식 클래스들까지로 범위를 제한한다는 의미이다. -> 타입 매개변수 상한이라고 부른다.
- 타입 매개변수 상한을 사용하면, Animal 클래스를 최대 클래스로 생각하여, Animal 클래스에 있는 기능들을 사용할 수 있게 된다.
출처
김영한의 실전 자바 - 중급 2편