Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以对象作为值的Java HashMap以及任何扩展它的东西?_Java_Hashmap - Fatal编程技术网

以对象作为值的Java HashMap以及任何扩展它的东西?

以对象作为值的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,它将字符串作为键,将对象作为值,在本例中,我创建了一个名为ItemBuilder的类。我可以将另一个类作为值进行扩展,但我不能使用该类拥有的任何方法。为什么会这样

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文档时,您将看到一个for
Map
方法被定义为
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是的,如果你想调用不同的方法,你必须这样做。