Как реализовать шаблонный класс, который реализует Коллекции - PullRequest
2 голосов
/ 07 марта 2012

Это проблема с домашней работой, с которой у меня возникают трудности. Скелет для класса приведен ниже:

public class Storage<E> implements java.util.Collection<E> {
private Object[] data = new Object[256];
private int nextEmptySlot = 0;

@Override
public java.util.Iterator<E> iterator() {
    // returns a class that iterates over the data array
    return new java.util.Iterator() {
        // insert the body of the inner class here
        // 3 methods: remove(), hasNext(), next()
        };
    }
//Override all methods required by the interface
}

Теперь проблема в том, что я пишу такие функции, как contains (Object o), потому что шаблон не заставляет E быть сопоставимым. Как я могу рассматривать шаблонный тип E как сопоставимый, чтобы я мог использовать equals и compateTo? Я знаю, что есть способы сделать это в объявлении класса, но объявление класса дано и не требует, чтобы E было сопоставимым ...

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

Единственными коллекциями, которые реализуют порядок, являются SortedMap и SortedSet, и ни одна из них не накладывает ограничения на параметр типа. Внутренне я полагаю, что он приводит к Comparable<E> и выбрасывает ClassCastExcepton, если это не удается. Неупорядоченные коллекции зависят только от equals() и hashCode() и не нуждаются в Comparable.

3 голосов
/ 07 марта 2012

Вам не нужно compareTo(), потому что это даст вам определение порядка элементов (хотя оно может сказать вам, равны ли два объекта).Если порядок здесь не важен, это все равно не то, что вам нужно.

Если предположение о том, что порядок не требуется, является правильным, то все, на что вы должны полагаться, - это метод equals() каждогоэкземпляр в коллекции.

  1. Если E правильно переопределяет методы equals() и hashCode(), сам E сможет определить, находится ли элемент в этой коллекции.
  2. Если он не переопределил метод equals(), то экземпляр будет опираться на реализацию equals() *1016*, которая просто сравнивает ссылки (если они оба ненулевые).

Я бы посоветовал вам сначала убедиться в четкости требования этого задания.Если в требованиях указано что-то более конкретное, вы можете определить, какое равенство существует в вашей коллекции.Если вы не можете получить ничего более ясного, я думаю, что ваш единственный выбор - полагаться на реализацию E equals().

0 голосов
/ 07 марта 2012

Вы можете связать тип E

public class Storage<E  **extends Comparable**> implements java.util.Collection<E>

И вы можете параметризировать Comparable так, как вам нужно.

...