2011-11-15 5 views
1

ArrayList 또는 LinkedList를 백엔드로 사용하여 Bag 데이터 유형을 구현하도록 과제가 요청되었습니다. 필자는 ArrayList를 선택하고 Collection 인터페이스의 로컬 구현을 포함하여 자체 구현을 만들었습니다. 이제 List 내에서 List를 삽입하는 My List 클래스를 사용하여 Bag의 속성을 적용하는 방법에 대한 기본 개념을 고민하고 있습니다. 제네릭에 Arraylist 기반 Bag/Multiset- stuck 구현

내 목록 설정 방법

내가, 크기를 추가, 제거 구현

public interface Collection<E> 

로 내 자신의 컬렉션 인터페이스 유형을 쓴 이유는 구현되지 않은 모든 방법을 제외하고는 일반적인 자바 유형을 다음과 , clear, contains, isEmpty 및 toArray 메서드를 호출합니다.

리스트 유형은 선언과 같은 세 가지 private 필드와

public class List<E> implements Collection<E> 

:

private int size; 
private E[] data; 
private int growSize=10; 

E[] data가 필요한 어떤 요소 유형 보유하고 있으며 growSize 목록을 높이기 위해 새로운 슬롯의 수 필요한만큼 크기. 이 기능은 List가 단일 객체에 대해 전통적으로 사용되는 경우 훌륭하게 작동하지만 List 유형을 삽입하려고하면 오류가 발생합니다.

나는이 방법을 구현하기 위해 노력하고있어 :

  • 첫째 :이 때

    public boolean add(Collection<E> c){ 
        if (size < data.length){ 
        data= (E[]) new Object[10]; 
        data[0]= c; 
        } 
    } 
    

    , 거기 수집 및 E. 사이에 유형 불일치의

    두 질문 말합니다를 , Java generics의 어떤 규칙을 내가 여기에서 위반하고 왜?

  • 둘째, 해결하기 위해 무엇이 필요합니까?
+0

, 당신의 오류 및 오류의 원인 코드에 대한 자세한 정보를 제공 –

+0

E 유형 목록 이 될 수 있습니다하십시오 : 당신은 같은 것으로 구현을 변경해야합니다. 어떤 오류가 발생하고 있습니까? – JustinKSU

+0

'add'는 무엇을합니까? 단일 요소를 추가 하시겠습니까? 또는 일부 컬렉션의 모든 요소를 ​​추가 하시겠습니까? – newacct

답변

3

두 가지 유형에 대해 매개 변수화 된 유형을 사용할 수 없습니다. 귀하의 경우 (얻을 경우) E 형식 및입력하십시오 매개 변수화 된 형식 E 사용하려고합니다.

List<E>에서 두 가지 유형을 사용하려는 경우 실제로는 제네릭을 사용하지 않습니다. 그것없이리스트 (그리고 슈퍼 타입 콜렉션)를 선언 할 수 있습니다.

E 유형의 개체가 목록의 요소가되도록 형식 E의 개체 목록을 수락하고 각 개체를 List<E>에 하나씩 추가하려는 경우

public boolean addAll(Collection<E> c) { 
    for(E e : c) { 
    this.add(e); 
    } 
}