Generics(2)

3. 지네릭 클래스의 객체 생성과 사용


  • Box< T >의 객체를 생성할 때 참조변수와 생성자에 대입된 타입(매개변수화된 타입)이 일치해야 함 (상속관계에 있어도 불가능)

  • 단, 두 지네릭 클래스의 타입이 상속관계에 있고, 대입된 타입이 같은 것은 괜찮음

    Ex)

      Box<Apple> appleBox = new Box<Apple>( ); // 가능
      Box<Apple> appleBox = new Box<>( ); // JDK1.7부터 추정이 가능한 경우 타입 생략 가능

      Box<Fruit> appleBox = new Box<Apple>( ); // 에러
      Box<Apple> appleBox = new FruitBox<Apple>( ); // OK. 다형성

4. 제한된 지네릭 클래스


  • 지네릭 타입에 'extends'를 사용하면, 특정 타입의 자손들만 대입할 수 있게 제한할 수 있음
  • 클래스가 아니라 인터페이스를 구현해야 한다는 제약이 필요해도 extends사용 (implements아님)
  • 특정 클래스의 자손들만 대입하고 인터페이스도 구현해야 한다면 '&'기호로 연결
    Ex)
      class FruitBox<T extends Fruit> {
          ArrayList<T> list = new ArrayList<T> ( );
      }

      interface Eatable { }
      class FruitBox<T extends Eatable> { ... }

      class FruitBox<T extends Fruit & Eatable> { ... }

5. 와일드 카드


  • static메서드에는 타입 매개변수 T를 매개변수에 사용할 수 없으므로, 지네릭스를 적용하지 않던가, 타입 매개변수 대신, 특정 타입을 지정해줘야 함
  • 하지만 타입을 고정해놓으면 해당 타입의 매개변수만 사용할 수 있다.
  • 지네릭 타입은 컴파일러가 컴파일할 때만 사용하고 제거해버리기 때문에 오버로딩이 성립하지 않는다
    => '와일드카드'로 해결 가능

Ex)

    <? extends T>  // 와일드 카드의 상한 제한. T와 그 자손들만 가능
    <? super T>  // 와일드 카드의 하한 제한. T와 그 조상들만 가능
    <?>  // 제한 없음. 모든 타입이 가능. <? extends Object>와 동일

java의 정석 chapter12

좋은 웹페이지 즐겨찾기