제한된 Generic class

0

Generic

목록 보기
4/6

제한된 Generic class 란?

  • extneds로 대입할 수 있는 타입을 제한
class FruitBox<T extends Fruit> { // Fruit의 자손만 타입으로 지정가능
	// extends가 없다면 모든 타입이지만, Fruit를 포함한 자손만 대입이 가능하다.
    ArrayList<T> list = new ArrayList<T>(); 
}
FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK
FruitBox<Toy> toyBox = new FruitBox<Toy>(); // error, Toy는 Fruit의 자손이 아님
  • 인터페이스인 경우에도 extends를 사용
interface Eatable { } 
class FruitBox<T extends Eatable> { } 
  • 인터페이스를 같이 사용할때 implements 대신 &로 표현
class FruitBox<T extends Fruit & Eatable> extends Box<T> {}

Generics의 제약

  • 타입 변수에 대입은 인스턴스 별로 다르게 가능
Box<Apple> appleBox = new Box<Apple>(); // OK, Apple객체만 저장 가능
Box<Grape> grapeBox = new Box<Grape>(); // OK, Grape객체만 저장 가능
  • static 멤버에 타입변수 사용 불가
    (모든 인스턴스에 공통이기 때문)
class Box<T> {
	static T item; // 에러
    static int compare(T t1, T t2){ ... } // 에러
}
  • 배열 생성할 때 타입 변수 사용불가, 타입 변수로 배열 선언은 가능
    new 연산자는 타입이 확정되어야 하기 때문
class Box<T> {
	T[] itemArr ; // OK, T타입의 배열을 위한 참조 변수
    
    T[] toArray() {
    	T[] tmpArr = new T[itemArr.length]; // 에러, 지네릭 배열 생성 불가
        // new 생성자를 쓸 때는 확정된 타입만 써야한다. 
        //즉 객체생성, 배열 생성에서는 지네릭을 통한 생성을 할 수 없다는 것
        . . .
    }

0개의 댓글