HashMap для классов, а не объектов

Я хочу назначить классы ui для каждого класса модели. Под этим я хочу найти класс, где хранить дату из пользовательского интерфейса. Пожалуйста, не обращайтесь к дизайну, но к моему вопросу об использовании HashMap; -)

Я знаю класс HashMap, но только использовал его для назначения объектов другим объектам.

Как мне связать между собой два КЛАССА друг с другом?

public static final HashMap<class,class> componentMap=new HashMap<class, class>();
componentMap.put(ToolPanel.class, ToolComponent.class);

Код выше не работает...

Ответ 1

Вы хотите Map<Class<?>, Class<?>>.

Class здесь относится к java.lang.Class, который является обобщенным типом. Если у вас нет более конкретных ограничений, можно использовать неограниченный шаблон <?> (см. Эффективное Java 2nd Edition, Item 23: Не использовать необработанные типы в новом коде)

Обратите внимание, что здесь используется interface Map вместо конкретной реализации HashMap (см. Эффективное Java 2nd Edition, пункт 52: обратитесь к объектам по их интерфейсам).

Обратите внимание, что Map<Class<?>, Class<?>> все еще отображает объекты, но тип этих объектов теперь Class<?>. Тем не менее они все еще являются объектами.

См. также

Связанные вопросы


Наложение ограничений с ограниченными wilcards

Здесь пример наложения ограниченных подстановочных знаков, чтобы иметь Map, ключи которого должны быть Class<? extends Number>, а значениями могут быть любые Class<?>.

    Map<Class<? extends Number>, Class<?>> map
        = new HashMap<Class<? extends Number>, Class<?>>();

    map.put(Integer.class, String.class);        // OK!
    map.put(Long.class, StringBuilder.class);    // OK!

    map.put(String.class, Boolean.class);        // NOT OK!
    // Compilation error:
    //     The method put(Class<? extends Number>, Class<?>)
    //     in the type Map<Class<? extends Number>,Class<?>>
    //     is not applicable for the arguments (Class<String>, Class<Boolean>)

Как вы можете видеть, универсальный механизм безопасности типов компиляции предотвратит использование String.class в качестве ключа, поскольку String не extends Number.

См. также

Ответ 2

Должно быть:

HashMap<Class,Class>

(капитал C)

или лучше:

HashMap<Class<?>,Class<?>>

Ответ 3

Декларация должна быть:

public static final HashMap<Class<?>, Class<?>> componentMap = new HashMap<Class<?>, Class<?>>();