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

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

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

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

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

Приведенный выше код не работает ...

16
задан Jasper 8 January 2012 в 12:27
поделиться

3 ответа

Вам нужна Карта <Класс , Класс > .

Класс здесь относится к java.lang.Class , который является обобщенным типом. Если у вас нет более конкретных границ, можно использовать неограниченный подстановочный знак (см. Эффективное 2-е издание Java, Правило 23: Не используйте необработанные типы в новом коде )

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

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

См. Также

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


Наложение ограничений с помощью ограниченных символов подстановки

Вот пример применения ограниченных символов подстановки для Map чьи ключи должны быть Class , а значения могут быть любыми 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 не расширяет Number ].

См. Также

29
ответ дан 30 November 2019 в 17:04
поделиться

Это должно было быть:

HashMap<Class,Class>

(заглавная C)

или лучше:

HashMap<Class<?>,Class<?>>
3
ответ дан 30 November 2019 в 17:04
поделиться

Объявление должно быть таким:

public static final HashMap<Class<?>, Class<?>> componentMap = new HashMap<Class<?>, Class<?>>();
2
ответ дан 30 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: