2012-06-28 3 views
5

Это, вероятно, простое недоразумение с моей стороны.Невозможно передать HashMap <String, String> в расширяемый интерфейс Map <String, String>

Есть простой интерфейс:

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

Тогда я пытаюсь использовать:

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

Передает синтаксис и компилировать, но во время выполнения я получаю:

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

Любое представление, где мое недоразумение дженериков в этом случае?

+5

Вы не недопонимание дженерик, вы непонимание наследования , – Marcelo

+0

Любые причины для продления карты? Вы переопределяете какие-либо методы? – kosa

+0

Цель состоит в том, чтобы создать интерфейс, который скрывает общие элементы, а также удерживать (не показано в примере) определения строки ключевой строки карты –

ответ

10

HashMap не реализует свой интерфейс IParams, так что вы не можете бросить HashMap к IParams. Это не имеет ничего общего с дженериками.

IParams и HashMap являются «братьями и сестрами», в том смысле, что оба они выполняют или расширяют Map. Но это не значит, что вы можете лечить HashMap, как если бы это IParams. Предположим, что вы добавите метод в свой интерфейс IParams.

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

Ofcourse, someMethod не существует в HashMap. Если листинг HashMap на IParams будет работать, что бы вы ожидали, если попытаетесь вызвать метод?

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

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

Что касается Вашего комментария:

намерение состоит в том, чтобы создать интерфейс, который скрывает дженерики, а также провести (не показано в примере) отображают ключевые определения строк

что вы могли бы сделать, это создать класс, который реализует IParams и расширяет HashMap:

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

IParams params = new Params(); 
+1

Фантастическое объяснение, я не думал о терминах братьев и сестер. Я слишком старался использовать реализацию HashMap напрямую, и ваше предложение о создании быстрого конкретного класса выглядит довольно разумно. Спасибо, Йеспер. –

3

HashMap реализован Map интерфейса, но не реализовал свой интерфейс IParams, даже если вы интерфейс, полученный из Map, вы не можете бросить его IParams, как это не типа IParams

Смежные вопросы