Sto progettando un codice polimorfico per eseguire operazioni matematiche. L'idea è di astrarre la rappresentazione sottostante dei dati, poiché i diversi casi d'uso richiedono rappresentazioni differenti. Le operazioni possono essere eseguite solo con dati dello stesso tipo.
Ci sono molti algoritmi che operano su queste cose e poiché questi algoritmi richiedono molte operazioni. Pertanto, il miglior design di IMO è quello di creare un'interfaccia di base che definisca le operazioni polimorfiche e che ogni tipo di dati sia un'implementazione di tale interfaccia:
interface Datum<D extends Datum<D>> {
D fuzz();
D fuse(D that);
D fizz(int base);
}
class MadDatum extends Datum<BigDatum> {
...
}
Tuttavia, ho bisogno anche di determinate costanti per essere definite per ogni rappresentazione. Vorrei accedere a queste costanti in modo polimorfico in modo che gli algoritmi generici che sono agnostici all'implementazione di Datum
possano ottenere in modo pulito costanti del tipo corretto. Poiché le costanti non dipendono da Datum
, non ha senso definirle come metodi lì. Ma l'unica alternativa ragionevole che posso pensare è creare una gerarchia di tipi paralleli che rappresenta il tipo di dati:
interface DataType<D extends Datum<D>> {
D warpTorsion();
D meltingAngle();
}
Ma allora i metodi devono prendere sia il tipo che i dati:
<D extends Datum<D>> D newmansMethod(DataType<D> type, Collection<D> data);
Questo design è scomodo perché duplica la gerarchia delle classi in un modo che il compilatore non controlla - si può facilmente implementare i dati e si dimentica di implementare un DataType corrispondente - e richiede un parametro di metodo aggiuntivo in possibilmente centinaia di metodi.
Sono consapevole che Haskell ammette un'elegante soluzione a questo problema perché consente di specificare le costanti / "funzioni null" nelle classi di tipi. Qualcuno sa un modo pulito per replicare questa funzionalità in Java?