2012-06-28 18 views
5

Jest to prawdopodobnie proste nieporozumienie z mojej strony.Nie można rzutować HashMap <String, String> na interfejs rozszerzający mapę <String, String>

mają prosty interfejs:

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

Następnie próbuję użyć:

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

Podania składni i kompilacji, ale w czasie wykonywania otrzymuję:

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

żadnego wglądu w którym moje niezrozumienie generycznych jest w tym przypadku?

+5

Nie jesteś nieporozumienie rodzajowych, jesteś nieporozumienie dziedziczenie . – Marcelo

+0

Jakiś powód do rozszerzenia mapy? Czy nadpisujesz jakieś metody? – kosa

+0

Intencją jest stworzenie interfejsu, który ukrywa generyczne, a także trzyma (nie pokazano w przykładzie) definicje kluczy mapowych. –

Odpowiedz

10

HashMap nie implementuje interfejsu IParams, więc nie można rzucić HashMap do IParams. To nie ma nic wspólnego z rodzajami.

IParams i HashMap są "rodzeństwem", w tym sensie, że oba implementują lub rozszerzają Map. Ale to nie znaczy, że możesz traktować numer HashMap tak, jakby był IParams. Załóżmy, że chcesz dodać metodę do swojego interfejsu IParams.

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

Oczywiście, someMethod nie istnieje w HashMap. Jeśli rzutowanie funkcji HashMap do zadziała, co by się stało, gdybyś spróbował wywołać tę metodę?

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

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

W odniesieniu do Twojego komentarza:

Zamiarem jest stworzenie interfejsu, który ukrywa rodzajowych, a także do przechowywania (nie pokazano w przykładzie) map kluczowe definicje strunowe

Co można zrobić, to utworzyć klasę, która implementuje IParams i rozciąga HashMap:

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

IParams params = new Params(); 
+1

Fantastyczne wytłumaczenie, nie myślałem w kategoriach rodzeństwa. Próbowałem zbyt mocno, aby użyć bezpośrednio implementacji HashMap, a twoja sugestia utworzenia szybkiej konkretnej klasy wygląda całkiem rozsądnie. Dzięki Jesper. –

3

HashMap realizowane Map interfejs, ale nie realizowane interfejsu IParams nawet jeśli interfejs pochodzi z Map, nie można rzucać go IParams gdyż nie jest typem IParams

Powiązane problemy