2011-08-31 3 views
2
public class Stack<E> { 
    public Stack() {....} 
    public void push (E e) {....} 
    public E pop() {....} 
    public boolean isEmpty(){....} 
} 

public void pushAll (Collection<E> src) { 
    for (E e: src){ 
     push(e) 
    } 
} 

특수 구문없이 A를 확장하는 유형 B의 유형 A 값의 일반 콜렉션에 추가 할 수 있습니까?

Stack<number> numberStack = new Stack<Number>(); 
Collection<Integer> integers=... 
numberStack.pushAll(integers); 

정수는 numberStack에 정수 컬렉션을 추가 할 수 있도록 정수를 확장합니다. 그러나 이것은 오류 컴파일이라고 들었습니다 - 왜?

+0

'pushAll'은 실제로'Stack '내에 정의되어 있다고 가정합니다, 맞습니까? –

+0

@Nir : 더 나은 질문 제목을 선택하십시오. 실제로 다른 여러 가지 질문이 있습니다. 다른 제목을 쓰는 것과 똑같은 제목이 붙어 있습니다 (실제로 한 사람이 거의 똑같은 질문을하므로 중복 된 것으로 투표합니다). –

+0

그래, 그럴거야. – Numerator

답변

12

코드는 단지이 Stack는이 같은 같은 형식 매개 변수와 Collection을 받아 있음을 지정했습니다. 이것은 당신이 E (즉 당신이이 특정 유형 상관 없어 확장하는 Collection 일부의 유형을 기대한다는 것을 의미

public void pushAll (Collection<? extends E> src) 

만 :

는이 같은 pushAll 방법을 작성해야 이어야합니다. E 또는 일부 하위 유형이어야합니다.

Collection.addAll()의 정의를 확인하십시오. 동일한 방식으로 정의됩니다.

1

문제는 두 가지 유형이 있지만 일반 표현 (E)이 하나뿐이므로 E는 숫자뿐 아니라 정수이기도합니다. 그게 혼란스러워. 컬렉션에 대해 동일한 유형이 있어야합니다.

pushAll(Collection<K> src) 

에 다시 작성 및 E.