我想将 ui-Classes 分别分配给一个模型类。通过这个我想找到从用户界面存储日期的类。请不要引用设计,而是引用我关于 HashMap
用法的问题 ;-)
我知道 HashMap
类,但只用它来将对象分配给其他对象。
我如何设法始终将两个 CLASSES 相互链接?
public static final HashMap<class,class> componentMap=new HashMap<class, class>();
componentMap.put(ToolPanel.class, ToolComponent.class);
上面的代码不工作...
最佳答案
你想要一个 Map<Class<?>, Class<?>>
。
这里的 Class
指的是 java.lang.Class
,是一个泛化类型。除非您有更具体的界限,否则可以使用无界通配符 <?>
(请参阅Effective Java 2nd Edition,第 23 项:不要在新代码中使用原始类型)
请注意,这里使用 interface Map
而不是特定的实现 HashMap
(参见Effective Java 2nd Edition,第 52 项:通过接口(interface)引用对象)。
注意 Map<Class<?>, Class<?>>
仍然映射对象,但是那些对象的类型现在是 Class<?>
。尽管如此,它们仍然是对象。
另见
- Java Tutorial/Generics ( original dead link from Archive.org )
- Angelika Langer's Java Generics FAQ
- JLS 15.8.2 Class Literals
A class literal is an expression consisting of the name of a
class
[...] followed by a.
and the tokenclass
. The type of a class literal,C.class
, whereC
is the name of aclass
[...] isClass<C>
.
相关问题
使用有界通配符施加限制
这是一个使用有界通配符来获得 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
。
另见
关于java - HashMap 用于类,而不是对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3456491/