универсальный интерфейс: список чего-то конкретного - PullRequest
1 голос
/ 04 мая 2009

Я хочу определить интерфейс MyList, который представляет собой список интерфейса MyThing. Частью семантики MyList является то, что его операции не имеют никакого значения для объектов, которые не реализуют интерфейс MyThing.

Это правильная декларация?

interface MyList<E extends MyThing> extends List<E> { ... }

edit: (part 2) Теперь у меня есть другой интерфейс, который возвращает MyList в качестве одного из методов.

// I'm defining this interface
// it looks like it needs a wildcard or template parameter
interface MyPlace {
    MyList getThings();
}

// A sample implementation of this interface
class SpecificPlace<E extends MyThing> implements MyPlace {
    MyList<E> getThings();
}

// maybe someone else wants to do the following
// it's a class that is specific to a MyNeatThing which is
// a subclass of MyThing
class SuperNeatoPlace<E extends MyNeatThing> implements MyPlace {
    MyList<E> getThings();
    // problem?
    // this E makes the getThings() signature different, doesn't it?
}

Ответы [ 3 ]

2 голосов
/ 04 мая 2009

Да, по крайней мере, так EnumSet делает это.

public abstract class EnumSet<E extends Enum<E>><br> extends AbstractSet<E>


Изменить в ответ на часть 2:

Я не уверен, почему возвращаемый тип getThings() в интерфейсе не жалуется на необработанные типы. Я подозреваю, что из-за стирания типов предупреждения в интерфейсах были бы бесполезны, даже если бы они были там (нет и предупреждения, если вы измените тип возврата на List).

По второму вопросу, поскольку MyNeatThing распространяется MyThing, E находится в его пределах. Это что-то вроде использования extends ограничения в общем параметре, не так ли?

1 голос
/ 04 мая 2009

Для части 1, да, это выглядит правильно.

Для вашей части 2 я предлагаю что-то вроде следующего. Метод возвращает MyList чего-то, что вы не знаете, что это такое (очевидно, оно отличается для разных реализаций), но вы знаете, что это подтип MyThing.

interface MyPlace {
    MyList<? extends MyThing> getThings();
}
0 голосов
/ 05 мая 2009

Имейте в виду, что реализация интерфейсов, таких как java.util.List , правильная - сложная задача; поэтому задайте себе все эти вопросы:

  • Могу ли я использовать java.util.List "как есть", сделать Мне нужно добавить / удалить функциональность?
  • Есть ли что-то более простое, что я мог бы реализовать, например Iterable ?
  • Могу ли я использовать композицию? (против наследования)
  • Могу ли я найти новый желаемый функционал в существующие библиотеки, такие как Google Коллекции?
  • Если мне нужно добавить / удалить функциональность, стоит ли добавленная сложность?

Тем не менее, вы могли бы просто использовать java.util.List для вашего примера:

interface MyPlace<T extends MyThing> {
   List<T> getThings();
}

class SpecificPlace implements MyPlace<MyThing> {
   public List<MyThing> getThings() { return null; }
}

class SuperNeatoPlace implements MyPlace<MyNeatThing> {
   public List<MyNeatThing> getThings() { return null; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...