He estado luchando con el siguiente problema. Tengo una serie de objetos de función, cada uno con sus propios tipos de entrada y salida definidos a través de argumentos de tipo genérico en java. Me gustaría organizar estos en una cadena para que los datos brutos se introduzcan en la primera función, transformados en el tipo de salida, que es el tipo de entrada del siguiente objeto, y así sucesivamente. por supuesto, esto sería trivial para el código duro, pero me gustaría que el código se pueda conectar a nuevos objetos de función. si acabo de dejar de lado argumentos de tipo (sólo el tipo de salida final), se trata de cómo se ven las cosas:Genéricos de Java: encadenando objeto de función genérico
public T process() {
Iterator<Context> it = source.provideData();
for(Pipe pipe : pipeline) {
it = pipe.processIterator(it);
}
return sink.next(it);
}
aquí un iterador sobre los datos se pasan entre los objetos de función, y el contexto debe ser Contexto. ¿Hay alguna manera de mantener el siguiente tipo de tubería enchufable y de mantener la seguridad del tipo?
edición: para mayor claridad, tengo una serie de objetos de función, tuberías. cada uno toma como entrada un tipo particular y saca otro tipo. (en realidad, un iterador sobre estos tipos) estos serán encadenados juntos, por ejemplo, Pipe<A,B> -> Pipe<B,C> -> Pipe<C,D> -> ...
, de modo que la salida de una tubería sea el tipo de entrada para la siguiente tubería. También hay una fuente aquí que genera un iterador de tipo A y un receptor que aceptará el tipo (la salida de la tubería pasada). ¿Esto hace las cosas más claras? La pregunta es, porque existe una dependencia crítica en la compatibilidad de los tipos de entrada y salida, ¿hay alguna forma de asegurar esto?
Estoy empezando a pensar que la inserción de la función de objetos en la tubería puede ser el mejor momento para garantizar la seguridad del tipo, pero no estoy seguro de cómo hacerlo.
editar 2: i tener un método sumador para los objetos de función que actualmente se ve como a continuación:
public void addPipe(Pipe<?,?> pipe) {
pipeline.add(pipe);
}
me gustaría para comprobar si el primer parámetro tipo es el mismo que el "final" de la tubería actual, y lanzar una excepción si no? No creo que haya una buena forma de obtener seguridad en tiempo de compilación aquí. el "extremo" de la tubería de corriente se puede establecer en el segundo parámetro de tipo de la tubería de entrada. No puedo pensar en cómo hacer esto con genéricos, y pasar la información de la clase parece bastante horrible.
La borradura de tipo puede hacer su vida más difícil para funciones totalmente genéricas. El compilador de bytes JVM elimina el tipo de instancia de clases genéricas, por lo que la lista se convierte en la lista
¿Puede explicar el requisito un poco más? Incapaz de descubrir lo que tienes y lo que quieres tener. –
, entonces, ¿cuál sería el mejor enfoque para tratar de garantizar la seguridad de tipo al insertar el objeto de función de tubería (cómo?) Y simplemente suprimir las advertencias en este método anterior? – downer