Java Generics: объединение в цепочку универсальных функциональных объектов

Я боролся со следующей проблемой. У меня есть ряд функциональных объектов, каждый из которых имеет собственные типы ввода и вывода, определенные с помощью аргументов универсального типа в java. Я хотел бы расположить их в цепочке, чтобы необработанные данные вводились в первую функцию, преобразовывались в тип вывода, который является типом ввода следующего объекта, и так далее. конечно, это было бы тривиально для жесткого кода, но я хотел бы, чтобы код можно было подключить к новым объектам функций. если я просто оставлю аргументы типа (только окончательный тип вывода), все будет выглядеть следующим образом:

    public T process() {
        Iterator<Context> it = source.provideData();
        for(Pipe pipe : pipeline) {
            it = pipe.processIterator(it);
        }
        return sink.next(it);
    }

здесь итератор по данным передается между объектами функции, и контекст должен быть Context. есть ли способ сохранить заглушку следующего типа труб и при этом сохранить безопасность типа?

редактировать: для наглядности у меня есть ряд функциональных объектов, каналов. каждый принимает в качестве входных данных определенный тип и выводит другой тип. (фактически итераторы этих типов) они будут связаны вместе, например, Pipe -> Pipe -> Pipe -> ... , так что выход одного канала является типом входа для следующего канала. Здесь также есть источник, который выводит итератор типа A, и приемник, который принимает тип (вывод прошедшего канала).это проясняет ситуацию? Вопрос в том, есть ли способ гарантировать это, поскольку существует критическая зависимость от совместимости типов ввода и вывода?

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

редактировать 2: У меня есть метод сумматора для объектов функции, который в настоящее время выглядит следующим образом:

public void addPipe(Pipe<?,?> pipe) {
    pipeline.add(pipe);
}

я хотел бы проверить, совпадает ли параметр первого типа с «концом» текущего канала, и выдать исключение, если нет? Я не думаю, что здесь есть хороший способ обеспечить безопасность времени компиляции. "конец" текущего канала затем может быть установлен на параметр второго типа входного канала. Я не могу придумать, как это сделать с помощью дженериков, и передача информации о классе кажется довольно ужасной.

6
задан downer 30 December 2011 в 16:13
поделиться