Я боролся со следующей проблемой.У меня есть ряд функциональных объектов, каждый из которых имеет свои собственные типы ввода и вывода, определенные с помощью аргументов универсального типа в Java.Я хотел бы расположить их в цепочке так, чтобы исходные данные вводились в первую функцию, преобразовывались в тип вывода, который является типом ввода следующего объекта, и так далее.конечно, это было бы тривиально для жесткого кода, но я бы хотел, чтобы код был подключаем к новым объектам функций.если я просто опускаю аргументы типа (только конечный тип вывода), то вот как все это выглядит:
public T process() {
Iterator<Context> it = source.provideData();
for(Pipe pipe : pipeline) {
it = pipe.processIterator(it);
}
return sink.next(it);
}
здесь итератор данных передается между объектами функции, а контекст должен быть Context.Есть ли способ, чтобы следующий тип трубы был вставным и при этом сохранял безопасность типа?
edit: для ясности, у меня есть ряд функциональных объектов, каналов.каждый принимает в качестве входных данных определенный тип и выводит другой тип.(на самом деле итераторы для этих типов) они будут объединены в цепочку, например, Pipe<A,B> -> Pipe<B,C> -> Pipe<C,D> -> ...
, так что выходные данные одного канала являются типом ввода для следующего канала.Здесь также есть источник, который выводит итератор типа A, и приемник, который будет принимать тип (вывод предыдущего канала).это проясняет ситуацию?Вопрос в том, что существует критическая зависимость от совместимости типов ввода и вывода, есть ли способ обеспечить это?
Я начинаю думать, что при вставке объектов функции в конвейер может быть лучшее время для обеспечения безопасности типов, но я не уверен, как это сделать.
edit 2: у меня есть метод сумматора для функциональных объектов, который в настоящее время выглядит следующим образом:
public void addPipe(Pipe<?,?> pipe) {
pipeline.add(pipe);
}
Я хотел бы проверить, совпадает ли первый параметр типа с параметром "конец "текущей трубы, и выбросить исключение, если нет?я не думаю, что есть хороший способ обеспечить безопасность времени компиляции здесь.тогда «конец» текущей трубы может быть установлен на параметр второго типа входной трубы.Я не могу придумать, как сделать это с помощью дженериков, и передача информации о классе кажется довольно отвратительной.