2016-04-28 3 views
5

Итак, у меня есть класс, который я создал, который хотел бы сортировать. Для этого я просто реализовал интерфейс коллекции, чтобы его можно было использовать в классе Collections.Возможно ли реализовать как ListIterator, так и коллекцию в java?

Теперь я заметил, что сам класс - это просто прыжок, пропустить и перейти от ListIterator, и было бы неплохо, если бы он реализовал этот интерфейс (смотря в будущее на этом). Существует одна проблема, хотя, и это то, что есть способ конфликт между интерфейсом интерфейса Collection и ListIterator:

// from the Collection interface: 
public boolean add(E someElement); 

// from the ListIterator interface: 
public void add(E someElement); 

Можно ли иметь один класс соответствует обоим интерфейсам? Если нет, значит ли это, что эти два интерфейса являются взаимоисключающими?

+2

Я бы сначала спросил себя, почему вы чувствуете, что вам нужны оба. Если коллекция делает то, что вам нужно, зачем добавлять дополнительные требования ListIterator? Я всегда стараюсь не усложнять код, если у меня нет функциональной причины. – Kurtymckurt

+0

Это будет группа списков, которую я буду использовать в этой работе совсем немного, и я вижу в будущем возможность извлечения ListIterator из нее. Решением, которое я создал, было создание метода, который возвращал ListIterator данных. Не самое изящное решение, но решение все-таки ... –

+0

Не было бы хорошей идеей расширить класс AbstractList. Вы можете взглянуть на реализации 'ArrayList',' LinkedList' и как они решают одну и ту же проблему. – soufrk

ответ

5

Да, к сожалению, они являются взаимоисключающими.

Когда вы создаете (абстрактный) класс, который пытается реализовать оба варианта, вы получите ошибку компилятора.

Main.java:16: error: types ListIterator and Collection are incompatible; both define add(java.lang.Object), but with unrelated return types
abstract class Foo implements Collection, ListIterator

4

Вы правы, вы не можете реализовать оба варианта. Но, честно говоря, почему вы хотите это сделать?

Если вам нужно разоблачить ListIterator, почему бы вам не добавить метод, который возвращает его?

List, который проходит Collection, например, не распространяется ListIterator, он имеет метод, называемый listIterator, который возвращает итератор.

ListIterator<E> listIterator(); 

держать что-то в уме, Collection не является Iterator, Collection является Iterable.

+1

И это то, что я сделал. :) –

0

Как говорили другие, невозможно иметь оба класса.

Но семантика ListIterator, будучи Iterator, запрещает это, тем не менее: а Collection является то, что вы можете перебрать так часто, как вы хотите, в то время как Iterator это один выстрел вещь, которая после того, как вы итерацию над ним , может быть выброшено (или, в случае ListIterator, возможно, перематываться и повторно использоваться, но это не стандартный вариант использования).