Код: Выделить всё
interface Consumer {
/**
* @param sequence: an *ordered* collection of Ts to be processed in order
*/
public void consume(Collection sequence);
}
interface Producer {
Collection getSequence();
}
class Producer1 implements Producer {
public List getSequence() {
return new ArrayList();
}
}
class Producer2 implements Producer {
public Deque getSequence() {
return new LinkedList();
}
}
class Test {
void testMethod(Consumer consumer) {
consumer.consume(new Producer1().getSequence());
consumer.consume(new Producer2().getSequence());
}
}
Поэтому кажется, что единственный способ «обеспечить комфорт компилятора» — это указать последовательность как коллекцию; однако, согласно Javadoc (и, как мы все знаем), «некоторые упорядочены, а другие неупорядочены», поэтому API Consumer() теряет семантику.
Другой обходным решением было бы сделать так, чтобы Producer2 предоставлял LinkedList, а не Deque (и возвращал Consumer() для принятия списка), но мы знаем, что это не идеально предоставлять реализации, а не интерфейсы.
Кажется, идеальным решением для Java было бы предоставление суперинтерфейса Sequence для List и Deque (расширение Iterable). Я могу предположить, что одной из причин, по которой этого не было сделано, является сложность, но я думаю, что этот пример демонстрирует необходимость.
Я упускаю лучшую стратегию или мне просто нужно дождаться пересмотра API? Для справки: это Java 17.
Подробнее здесь: https://stackoverflow.com/questions/721 ... terface-of