2013-01-23 14 views
6

E 'possibile dichiarare una mappa che associa ogni chiave di una sottoclasse specifica per valori di una sottoclasse specifica ma assicurando che entrambe le classi condividano lo stesso parametro Tipo?Java: Dichiarazione di una mappa con due generici relativi tipi (?? <T> Mappa <Class <estende ClasseA <T>>, classe <estende ClassB <T> >>)

Per lo sfondo:

sia ClassA e ClassB implementare il comportamento di una risorsa comune

public abstract class ClassA<T> { 
     public abstract T getResource() ; 
} 

public abstract class classB<T> { 
     public abstract void consoumeResource(T resource); 
} 

voglio mappare dalle implementazioni di ClassA e ClassB e assicurare che solo le coppie "compatibili" possono essere messi insieme in una voce.

risposta

4

Un altro modo sarebbe quello di fornire la propria implementazione Map. Non c'è molto codice necessario se si estende un'implementazione esistente e utilizzare il nuovo tipo:

public class CompatibleHashMap<T> extends HashMap<ClassA<T>, ClassB<T>> { 

} 

Ora, un CompatibleHashMap<String> permette solo di mettere ClassA<String> come chiavi e ClassB<String> come valori.

EDIT:

Come lei ha ricordato nel tuo commento, in questo modo vi state legando a un'implementazione Map. È possibile superare questo facendo qualcosa di simile a quanto segue:

public class CompatibleMap<T> implements Map<ClassA<T>, ClassB<T>> { 

    private Map<ClassA<T>, ClassB<T>> map; 

    public CompatibleMap(Map<ClassA<T>, ClassB<T>> map) { 
     this.map = map; 
    } 

    @Override 
    public Set<List<T>> keySet() { 
     return map.keySet(); 
    } 
    // ... implement all other Map methods by calling the method on map. 
} 

È quindi possibile istanziare come

CompatibleMap<String> map = new CompatibleMap<>(new HashMap<ClassA<String>, ClassB<String>>()); 

In questo modo, non sono legati a uno specifico Map implementazione, e il compilatore genera un errore se i tipi generici di map, e ClassB non corrispondono.

+0

Questo non è esattamente quello che stavo cercando, poiché mi sto legando a una concreta implementazione di Map - ma è la soluzione migliore che riesco a vedere. Grazie. – DThought

+0

@DPerfetto: vedi la mia modifica. – jlordo

4

Non è possibile farlo nella dichiarazione Mappa ma è possibile farlo utilizzando metodi che accedono/aggiornano la mappa.

ad es.

Problemi correlati