728x90
반응형
class A
class B extends A
B는 A의 하위 타입이다. 하지만 List<B>는 List<A>의 하위타입이 아니다.
제네릭 타입을 사용할 때 가끔 클래스의 하위 타입을 받아들여야 하는 경우가 있다.
아래의 소스를 보자
public static Stack<A> pushAll(final List<A> list){
final Stack<A> stack = new Stack<>();
for(A a : list){
stack.push(a);
}
return stack;
}
public void test(){
final ArrayList<A> listA = new ArrayList<>();
final ArrayList<B> listB = new ArrayList<>();
for(int i=0; i<10; i++){
listA.add(new A());
listB.add(new B());
}
final Stack<A> stack1 = pushAll(listA);
final Stack<B> stack2 = pushAll(listB); // 컴파일 오류
}
B는 A의 하위 클래스지만 List<B>는 List<A>의 하위 클래스가 아니기 때문에 오류가 난다.
이럴 때 ?
와일드카드를 사용하면 해당 오류를 해결할 수 있다.
public static Stack<A> pushAll(final List<? extends A> list)
이런식으로 제네릭을 설정하게 되면 컴파일러에게 A클래스를 확장한 모든 인스턴스를 사용할 수 있게 알려주는 것이다.
따라서 A클래스를 상속받은 list를 파라미터로 넘길 수 있다.
728x90
반응형
'그 외 ... (정리해야함) > 질문과 답변' 카테고리의 다른 글
try-with-resource문은 무엇인가? (0) | 2019.05.02 |
---|---|
오토박싱과 언박싱 이해하기 (0) | 2019.05.02 |
인터닝(Interning)이란 무엇인가? (0) | 2019.05.02 |
String 객체의 값을 변경할 수 있는가? (0) | 2019.05.02 |
String은 메모리에 어떻게 저장되는가? (0) | 2019.05.02 |