Written on
·
83
·
Edited
0
[질문 내용]
제네릭의 상한 설정을 소개하시기 전에 어떻게 특정 타입만을 받도록 할지 혼자 고민을 해 보았는데, 클래스 생성 시 생성자를 통해 받을 타입을 제한하면 어떨까 생각했습니다.
public class Box<T> {
private T animal;
public Box(Animal animal) {
this.animal = (T) animal;
}
}
결과적으로 문제를 해결하기는 했는데, 이 방법에도 여전히 문제가 있기 때문에 extends를 이용하는 거겠죠? 상기한 방법이 extends를 이용하는 방법보다 못한 점이 무엇인지 궁금합니다.
Answer 2
1
타입 T를 animal이 아닌 다른 타입을 주면, 오류가 나서 사용을 못합니다.
T 타입이 만약에 pood(식량) 이라면, animal이 식량에 못 들어 가기 때문에,
캐스팅 오류가 나서 작동을 못합니다. 그래서 exntds로 animal + 자식들만 들어오게 만든 것 입니다.
0
생각하는자 님의 답변에 첨언하면, Box<T>에서 T는 아무 클래스나 올 수 있기 때문에 다음과 같은 코드도 가능합니다.
Cat cat = new Cat("고양이", 100);
Box<Food> foodBox = new Box<>(cat);
이때 Animal → Food로의 변환은 타입매개변수 T를 사용하기에 컴파일러가 확인하지 않아 오류가 발생하지 않습니다.
그런데 만약 Box<T>에
public T getAnimal() {
return animal;
}
와 같이 getAniaml()
이 있다면,
Food food = foodBox.getAnimal();
에서 Animal → Food 로 타입을 바꾸려 시도하기 때문에 ClassCastException이 발생합니다.
따라서 클래스 내 모든 T에 제약을 걸기 위해 <T extends Animal>
을 사용하는 것입니다.