Forum Informatica Unict

Area Studenti => L'angolo del tecnico => Topic started by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 03-09-2014, 03:32:41



Title: Problema interfaccia ripetuta, sebbene diversa tramite templating...
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 03-09-2014, 03:32:41
Eccoci a una domanda veramente seria che pongo su Java.

Stavo programmando un bel po' di classi per un cosa complessa.

A un certo punto ho da ordinare due tipi di array.
Il primo array, chiamiamolo arrayA è di tipo TipoA [];
il secondo arra, chiamiamolo arrayB è di tipo TipoB [];

incidentalmente, TipoA extends TipoU ed anche TipoB extends TipoU, ove TipoU è una sovra-classe astratta (non istanziabile).

Adesso, per poter fare il confronto usando il metodo Arrays.sort (T[] a, Comparator<? super T> c) (http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-T:A-java.util.Comparator-), siccome mi seccavo a inventare due classi per fare due comparatori che agiscono comunque su classi diverse (che ne estendono una in comune), ho pensato di fare il tutto in un'unica classe, creando due metodi compare diversi (il metodo compare è previsto come obbligatorio dal contratto siglato con l'accettazione della implementazione dell'interfaccia Comparator), uno che accetta due oggetti di tipo TipoA e uno che accetta due oggetti di TipoB, così il binder dinamico non si confonderà quando dovrò usarne uno piuttosto che un'altro (le due classi non sono in parentela verticale fra loro).

Quindi ho scritto una classe del tipo
Code:
class mioComparatore implements Comparator<TipoA>, Comparator<TipoB> {
    int compare (TipoA o1, TipoA o2) {
        //... fa qualcosa e poi restituisce un intero
    }

    int compare (TipoB o1, TipoB o2) {
        //... fa qualcosa e poi restituisce un intero
    }
}
così onoro il patto siglato per le due interfacce Comparator.

Problema: il compilatore si lamenta di questo:
MioBelFile.java:12345: error: repeated interface
class mioComparatore implements Comparator<TipoA>, Comparator<TipoB> {
                                                             ^


Considerato che i due Comparator sono stati specializzati tramite templating in due diverse interfacce, seppur con nome (senza template) comune, non dovrebbero essere trattati come interfacce diverse? .penso

Mi seccherei davvero tanto a dover implementare Comparator<TipoU> e poi dovermi mettere a controllare manualmente se i tipi dei dati TipoU passati sono TipoA o TipoB (anche perché non possono essere altro, visto che TipoU è astratta), per una questione di eleganza del codice e di logica di ciò che volevo fare (sebbene possa essere un rognoso walk-around)...

Suggerimenti? Spiegazioni? .smile