Stavo scrivendo il codice l'altro giorno in Java, ed è stato improvvisamente colpito dal desiderio di poter aggiungere e rimuovere interfacce dai generici. Ad esempio, qualcosa come:
public <T extends A, IX> (T extends A, IX, IY) addIY(T value) {
...
}
public <T extends A, IX, IY> (T extends A, IX) removeIY(T value) {
...
}
rispettivamente aggiungere e rimuovere IY da T, che estende A e implementa IX. Ad esempio, supponiamo di avere un numero di pezzi di dati e di inviarli attraverso un numero di catene di elaborazione; e IY è la possibilità di restituire un timeout. Quando li invii tramite qualsiasi pipeline di elaborazione che hai creato, aggiungi loro IY. Per quanto riguarda Java, dovresti, ad esempio, avvolgerli in un IY o qualcosa del genere. Quando hanno finito di essere processati, se lo hanno fatto prima del timeout, rimuovi IY e lo trasmetti. (O scartalo.) Il wrap / unwrap funziona bene a meno che tu non abbia bisogno di rimuovere IX nel mezzo dell'elaborazione parallela, o vuoi che la tua funzione "remove IX" non si preoccupi dell'esistenza di IY. Ci potrebbe essere un ampio set di queste interfacce - "questo è un array", "questo ha un id di gruppo", "questo ha un timestamp", "questo è supportato da un file", ecc. Si potrebbe forse approssimare questo come il oggetto con una collezione di oggetti, ognuno dei quali rappresenta un'interfaccia. Tuttavia, si perde il controllo dei tipi in fase di compilazione. Potresti creare una classe per ogni combinazione di interfacce e disporre di un carico di navigazione per il controllo dei tipi, ma ciò sembra davvero sconveniente e potrebbe non risolvere il problema.
C'è una lingua che offre questo? Metodi con generici che specificano sia l'aggiunta che la rimozione di interfacce? Non so se sarebbe / dovrebbe essere implementato come cambiare l'oggetto esistente o come passare l'oggetto a un costruttore; Non ho esplorato tutte le ramificazioni di un tale sistema. Potrebbe anche esserci un modo per farlo funzionare in Java normale; Non ne sono sicuro. Penso che sia in parte ostacolato dall'incapacità di creare una classe anonima che implementa più di un'interfaccia.