Внедрение Arraylist Bag / Multiset, привязанного к генерикам - PullRequest
1 голос
/ 16 ноября 2011

Назначение попросило нас реализовать тип данных Bag, используя ArrayList или LinkedList в качестве внутреннего интерфейса. Я выбрал ArrayList и создал свою собственную реализацию, включая локальные реализации интерфейса Collection. Сейчас я борюсь с основной концепцией того, как адаптировать свойства Bag с помощью класса my List, в частности вставляя List в List.

Способ создания моего Списка соответствует обычному типу Java, за исключением того, что все методы не реализованы, поэтому я написал свой собственный тип интерфейса Collection как

public interface Collection<E>

реализует методы добавления, удаления, размера, очистки, содержит, isEmpty и toArray.

Тип списка объявлен как

public class List<E> implements Collection<E> 

с тремя приватными полями:

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

E[] data содержит любой необходимый тип элемента, а growSize - это количество новых слотов для увеличения размера списка по мере необходимости. Это прекрасно работает, когда список традиционно используется для отдельных объектов, но я получаю ошибки при попытке вставить тип списка.

Я пытаюсь реализовать этот метод:

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

Когда я пытаюсь это сделать, появляется сообщение о несоответствии типов между Collection и E.

Два вопроса:

  • Во-первых, какие правила дженериков Java я здесь нарушаю и почему?
  • Во-вторых, что нужно, чтобы это исправить?

1 Ответ

3 голосов
/ 16 ноября 2011

Нельзя использовать параметризованный тип для двух разных типов. В вашем случае (если я вас понял) вы пытаетесь использовать параметризованный тип E как для самого типа E, так и для типа Collection<E>.

Если вы пытаетесь использовать эти два разных типа в вашем List<E>, вы фактически не используете Generics. Вы можете просто объявить свой список (и коллекцию супертипов) без него.

Если вы пытаетесь принять список объектов типа E и добавить каждый из них один за другим к вашему List<E>, чтобы каждый такой объект типа E стал элементом в вашем Список, тогда вы должны изменить реализацию на что-то вроде:

public boolean addAll(Collection<E> c) { 
  for( E e : c ) {
     this.add(e);
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...