Я хочу назначить ui-классы модельному классу каждый. По этому я хочу найти класс, где хранить дату из пользовательского интерфейса. Пожалуйста, обращайтесь не к дизайну, а к моему вопросу об использовании HashMap
; -)
Мне известен класс HashMap
, но я использовал его только для назначения объектов к другим объектам.
Как мне всегда удается связать два КЛАССА друг с другом?
public static final HashMap<class,class> componentMap=new HashMap<class, class>();
componentMap.put(ToolPanel.class, ToolComponent.class);
Приведенный выше код не работает ...
Вам нужна Карта <Класс >, Класс >>
.
Класс
здесь относится к java.lang.Class
, который является обобщенным типом. Если у вас нет более конкретных границ, можно использовать неограниченный подстановочный знак >
(см. Эффективное 2-е издание Java, Правило 23: Не используйте необработанные типы в новом коде )
Обратите внимание, что карта интерфейса
используется здесь вместо конкретной реализации HashMap
(см. Эффективное 2-е издание Java, Правило 52: Обращайтесь к объектам по их интерфейсам ) .
Обратите внимание, что Map
по-прежнему отображает объекты, но теперь тип этих объектов - Class >
. Тем не менее они остаются объектами.
Литералы класса - это выражение, состоящее из имени
класса
[...], за которым следует Автор.
и токенкласс
. Тип литерала классаC.class
, гдеC
- это имя класса[...] -
Class
.
Вот пример применения ограниченных символов подстановки для Map
чьи ключи должны быть Class расширяет 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
не расширяет Number
].
Это должно было быть:
HashMap<Class,Class>
(заглавная C)
или лучше:
HashMap<Class<?>,Class<?>>
Объявление должно быть таким:
public static final HashMap<Class<?>, Class<?>> componentMap = new HashMap<Class<?>, Class<?>>();