inflearn logo
강의

Course

Instructor

Kim Young-han's Practical Java - Intermediate Part 2

Summary

제네릭 상한 설정을 위해 생성자를 활용하는 것이 extends보다 못한 점이 무엇인가요?

194

Sangjun Lee

3 asked

0

[질문 내용]
제네릭의 상한 설정을 소개하시기 전에 어떻게 특정 타입만을 받도록 할지 혼자 고민을 해 보았는데, 클래스 생성 시 생성자를 통해 받을 타입을 제한하면 어떨까 생각했습니다.

 

public class Box<T> {

  private T animal;

 

  public Box(Animal animal) {

    this.animal = (T) animal;

  }

}

 

결과적으로 문제를 해결하기는 했는데, 이 방법에도 여전히 문제가 있기 때문에 extends를 이용하는 거겠죠? 상기한 방법이 extends를 이용하는 방법보다 못한 점이 무엇인지 궁금합니다.

 

java 객체지향 코딩-테스트 알고리즘

Answer 2

1

thinking1dev1person

타입 T를 animal이 아닌 다른 타입을 주면, 오류가 나서 사용을 못합니다.

T 타입이 만약에 pood(식량) 이라면, animal이 식량에 못 들어 가기 때문에,

캐스팅 오류가 나서 작동을 못합니다. 그래서 exntds로 animal + 자식들만 들어오게 만든 것 입니다.

0

jaehyeonhan

생각하는자 님의 답변에 첨언하면, 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>을 사용하는 것입니다.

제네릭 타입 매개변수 제한과 관련한 문의입니다.

0

71

3

강의가 좀 버겁다 느껴질 때 학습방법 문의

1

119

4

제네릭 반환값 및 파라미터 선언 방식의 변화 <T> T

0

53

1

new T()가 안 되는 니유

0

93

1

안녕하세요, 문제와 실행 결과가 다른 부분이 있어 제보드립니다.

0

95

2

자바 로드맵 선택 질문

0

106

2

실전 자바 중급 - 2편 후 추천 강의

0

171

2

실프로젝트에서 Java25버전 사용

0

111

1

Arrays.sort

0

66

1

블로그 작성 시, 저작권 문제에 대하여

0

164

1

중급2편 56강의 bucket.add(value); 메서드가 이해가 안됩니다.

0

91

3

pop()과 poll()의 차이

0

93

1

특정 index의 노드 조회하기 질문

0

64

2

List.of() 비어있는 불변 리스트 생성

0

78

2

문제2: 개 타입 반환

0

49

2

[리뷰] 중급2편까지 겨우 완강 했습니다.

0

108

2

문제와 풀이1 Ex2와 Ex3

0

63

2

노드 삭제시 노드 null값으로 초기화

0

73

2

강의영상에 대한 질문

0

55

1

타입 매개변수 제한

0

57

1

compareTo

0

65

1

직접 구현하는 연결리스트 3 - 추가 부분 질문있습니다

0

93

3

섹션 8-58 equals and hashcode 에서 코드가 다르게 생성됨

0

65

2

퀴즈 오류 관련 문의

0

102

1