2012-06-28 21 views
5

Questo è probabilmente un semplice fraintendimento da parte mia.Impossibile trasmettere HashMap <String, String> a un'interfaccia che estende Map <String, String>

Avere una semplice interfaccia:

public interface IParams extends Map<String,String> { 
} 

poi cerco di usare:

IParams params = (IParams) new HashMap<String,String>(); 

Passi sintassi e compilare, ma in fase di esecuzione ottengo:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.foobar.IParams 

Tutta la comprensione in cui il mio fraintendimento dei generici è in questo caso?

+5

Non sei malinteso farmaci generici, si sta Misunderstanding eredità . – Marcelo

+0

Qualche motivo per estendere la mappa? Stai ignorando qualsiasi metodo? – kosa

+0

L'intenzione è quella di creare un'interfaccia che nasconda i generici, e anche di mantenere (non mostrato nell'esempio) le definizioni delle stringhe chiave della mappa –

risposta

10

HashMap non implementa l'interfaccia IParams, quindi non si può gettare un HashMap a un IParams. Questo non ha nulla a che fare con i generici.

IParams e sono "fratelli", nel senso che entrambi implementano o estendono Map. Ma questo non significa che puoi trattare un HashMap come se fosse un IParams. Supponiamo che tu aggiunga un metodo all'interfaccia IParams.

public interface IParams extends Map<String, String> { 
    void someMethod(); 
} 

Naturalmente, someMethod non esiste in HashMap. Se la trasmissione di un numero da HashMap a IParams funzionerebbe, cosa ti aspetteresti che accada se tentassi di chiamare il metodo?

IParams params = (IParams) new HashMap<String,String>(); 

// What's supposed to happen here? HashMap doesn't have someMethod. 
params.someMethod(); 

Per quanto riguarda il tuo commento:

L'intento è quello di creare un'interfaccia che nasconde i farmaci generici, e anche per tenere (non mostrato nell'esempio) mappare le definizioni stringa chiave

che cosa si potrebbe fare è creare una classe che implementa IParams ed estende HashMap:

public class Params extends HashMap<String, String> implements IParams { 
    // ... 
} 

IParams params = new Params(); 
+1

Fantastica spiegazione, non stavo pensando in termini di fratelli. Stavo provando troppo a usare direttamente l'implementazione di HashMap e il tuo suggerimento di creare una lezione concreta rapida sembra abbastanza ragionevole. Grazie Jesper. –

3

HashMap implementato Map interfaccia, ma non implementato tua interfaccia IParams anche se si interfaccia derivati ​​da Map, non puoi lanciare a IParams in quanto non è un tipo di IParams

Problemi correlati