Ho avuto problemi con il seguente problema. Ho una serie di oggetti funzione, ognuno con i propri tipi di input e output definiti tramite argomenti di tipo generico in java. Vorrei sistemarli in una catena in modo che i dati grezzi siano immessi nella prima funzione, trasformati nel tipo di output, che è il tipo di input dell'oggetto successivo, e così via. ovviamente questo sarebbe banale per l'hard-code, ma mi piacerebbe che il codice fosse collegabile ai nuovi oggetti funzione. se ho appena lasciare fuori argomenti di tipo (solo il tipo di output finale), questo è come stanno le cose:Java Generics: concatenamento di un oggetto funzione generico
public T process() {
Iterator<Context> it = source.provideData();
for(Pipe pipe : pipeline) {
it = pipe.processIterator(it);
}
return sink.next(it);
}
qui un iteratore sui dati viene passato tra gli oggetti di funzione, e il contesto dovrebbe essere Contesto. c'è un modo per mantenere il seguente tipo di tubo collegabile e mantenere ancora il tipo di sicurezza?
modifica: per chiarezza, ho una serie di oggetti funzione, tubi. ognuno prende come input un tipo particolare e emette un altro tipo. (in realtà un iteratore su questi tipi) questi saranno incatenati insieme, ad esempio, Pipe<A,B> -> Pipe<B,C> -> Pipe<C,D> -> ...
, in modo che l'output di una pipe sia il tipo di input per la pipe successiva. C'è anche una fonte qui che emette un iteratore di tipo A, e un sink che accetta il tipo (l'output del pipe passato). questo rende le cose più chiare? La domanda è, perché c'è una dipendenza critica dalla compatibilità dei tipi di input e output, c'è un modo per garantire questo?
Sto iniziando a pensare che sull'inserimento degli oggetti funzione nella pipeline potrebbe essere il momento migliore per garantire la sicurezza del tipo, ma non sono sicuro di come farlo.
Edit 2: Ho un metodo valore aggiuntivo per gli oggetti funzione che attualmente si presenta come di seguito:
public void addPipe(Pipe<?,?> pipe) {
pipeline.add(pipe);
}
mi piacerebbe verificare se il primo parametro tipo è la stessa come la "fine" di la pipa corrente e lanciare un'eccezione se non? non penso che ci sia un buon modo per ottenere la sicurezza del tempo di compilazione qui. la "fine" del tubo corrente può quindi essere impostata sul secondo tipo param del tubo di ingresso. Non riesco a pensare a come farlo con i generici, e passare le informazioni di classe mi sembra piuttosto orribile.
La cancellazione di tipo può rendere la vita più difficile per funzioni completamente generiche. Il compilatore di byte JVM rimuove il tipo dall'istanza delle classi generiche, quindi l'Elenco diventa List
Puoi spiegare un po 'di più il requisito? Incapace di capire cosa hai e cosa vuoi avere. –
quindi, l'approccio migliore sarebbe cercare di garantire la sicurezza del tipo quando si inserisce l'oggetto funzione pipe (how ??) e si limitano a sopprimere gli avvertimenti su questo metodo sopra? – downer