제네릭 문제 풀기
람다식의 사용
다음 중 올바르지 않은 문장을 모두 고르시오.
class Box<T extends Fruit> { T item; void setItem(T item) { this.item = item; } T getItem() { return item; } ============================ 1. Box<?> b = new Box(); 2. Box<?> b = new Box<>(); 3. Box<?> b = new Box<Object>(); 4. Box<Object> b = new Box<Fruit>(); 5. Box b = new Box<Fruit>(); 6. Box<? extends Fruit> b = new Box<Apple>(); 7. Box<? extends Object> b = new Box<? extends Fruits>();
Box<?> b = new Box(); // OK
Box<?>
는 Box<? extends Object>
를 줄여쓴 것이다. 객체 생성에 지네릭 타입을 지정해 주지 않았지만 문제가 되지는 않는다. 그래도, new Box()
대신 new Box<>()
를 사용하는 것이 좋다.Box<?> b = new Box<>(); // OK
new Box<>();
는 타입을 생략한 것으로, 일반적으로는 참조변수의 타입과 같은 타입으로 간주된다. 참조변수의 타입이 <?>
, 즉 <? extends Object>
이므로 생략된 타입은 Object
라고 생각하기 쉬운데 여기서는 지네릭 클래스 Box
에 정의된 타입이 <T extends Fruit>
와 같이 제한되어 있기 때문에 <Object>
가 아니라 <Fruit>
이 생략된 것으로 봐야 한다.Box<?> b = new Box<>(); // OK. Box<?> b = new Box<Fruit>();와 동일 Box<?> b = new Box<Object>(); // 에러 Box<?> b = new Box<Fruit>(); // OK // Box<?> b = new Box<Object>();와 같이 하면 에러가 발생한다. // Object는 Fruit의 자손이 아니기 때문이다.
Box<?> b = new Box<Object>(); // 에러.
Box<Object> b = new Box<Fruit>(); // 에러.
Box b = new Box<Fruit>(); // OK.
Box<?> b
가 더 낫다.Box<? extends Fruit> b = new Box<Apple>(); // OK.
Box<? extends Object> b = new Box<? extends Fruits>(); // 에러.
해당 없음