以对象作为值的Java HashMap以及任何扩展它的东西?
我有一个HashMap,它将字符串作为键,将对象作为值,在本例中,我创建了一个名为ItemBuilder的类。我可以将另一个类作为值进行扩展,但我不能使用该类拥有的任何方法。为什么会这样以对象作为值的Java HashMap以及任何扩展它的东西?,java,hashmap,Java,Hashmap,我有一个HashMap,它将字符串作为键,将对象作为值,在本例中,我创建了一个名为ItemBuilder的类。我可以将另一个类作为值进行扩展,但我不能使用该类拥有的任何方法。为什么会这样 HashMap<String, ItemBuilder> registry = new HashMap<String, ItemBuilder>(); registry.put("ZEUS_BOLT", new ZeusBolt()); registry.get(&q
HashMap<String, ItemBuilder> registry = new HashMap<String, ItemBuilder>();
registry.put("ZEUS_BOLT", new ZeusBolt());
registry.get("ZEUS_BOLT").testLog();
HashMap registry=newhashmap();
put(“宙斯螺栓”,新的宙斯螺栓());
get(“ZEUS_BOLT”).testLog();
当您检查Map文档时,您将看到一个forMap
方法被定义为V get(对象键)
。这意味着get
返回变量声明中指定类型的对象,在您的例子中是ItemBuilder
我假设ItemBuilder
没有testLog
方法,它是在ZeusBolt
中定义的。从get
获得一个ItemBuilder
对象
如果您希望能够调用testLog
,则需要将其转换为适当的类型,如下所示:
ZeusBolt zeusBolt = (ZeusBolt) registry.get("ZEUS_BOLT");
zeusBolt.testLog();
如果您在映射中有不同类型的对象,并且希望迭代所有对象并基于类型执行适当的操作,您可能会对instanceof
运算符感兴趣,以检查变量是否为给定类型:
ItemBuilder itemBuilder = registry.get("ZEUS_BOLT");
if (itemBuilder instanceof ZeusBolt){
ZeusBolt zeusBolt = (ZeusBolt) itemBuilder;
zeusBolt.testLog();
}
如果我想根据用户输入从注册表中获取一个项目,我会怎么做?比如说,如果我有一个ZeusBolt和一个Swarm类,它们都是扩展ItemBuilder的,那么我是否需要对每种类型进行if语句检查?@JordanBaron是的,如果你想调用不同的方法,你必须这样做。