Java多态性-从父映射获取子命令

Java多态性-从父映射获取子命令,java,polymorphism,parent-child,Java,Polymorphism,Parent Child,我上了两门课——建筑和仓库仓库扩展建筑。我已经创建了Building地图(Building\u map),在这里我放置了Building对象和Warehouse对象。 我想通过使用地图获得仓库的方法,但我只能看到来自建筑类的东西 building_map.get(ware_id); /*--Warehouse_function--*/; (这是我在这里的第一篇帖子,如果我对我的问题提供的信息太少,我感到非常抱歉) 编辑: 以下是我如何将对象添加到地图中: public st

我上了两门课——
建筑
仓库
<代码>仓库扩展
建筑
。我已经创建了
Building
地图(
Building\u map
),在这里我放置了
Building
对象和
Warehouse
对象。 我想通过使用地图获得
仓库
的方法,但我只能看到来自
建筑
类的东西

building_map.get(ware_id);   /*--Warehouse_function--*/;
(这是我在这里的第一篇帖子,如果我对我的问题提供的信息太少,我感到非常抱歉)

编辑: 以下是我如何将对象添加到地图中:

        public static Map<String, Building> building_map = new HashMap<>();

Building bD_02 = new Building("bD_02", 2, "Duargian", 2.5, 180, 450, 100, ""
                + "i0_024!i0_029!i0_036?90!10!10!" //upgrade lv 1
                + "&" 
                + "" //upgrade lv 2
                + "&" 
                + "" //upgrade lv 3
                + "&");

Building bD_03 = new Warehouse("bD_03", 3, "Duargian", 2.8, 800, 2500, 1500, 2.35, 3000, ""
                + "i0_021!i0_024!i0_029?200!500!70!" //upgrade lv 1
                + "&" 
                + "" //upgrade lv 2
                + "&" 
                + "" //upgrade lv 3
                + "&");

    building_map.put("bD_02", bD_02);                      
    building_map.put("bD_03", bD_03);                      
publicstaticmap-building_-Map=newhashmap();
建筑物bD_02=新建筑物(“bD_02”,2,“Duargian”,2.5180450100,”
+“i0_024!i0_029!i0_036?90!10!10!”//升级1级
+ "&" 
+“”//升级lv 2
+ "&" 
+“”//升级3级
+ "&");
建筑物bD_03=新仓库(“bD_03”,3,“Duargian”,2.8800,2500,1500,2.353000,”
+“i0_021!i0_024!i0_029?200!500!70!”//升级1级
+ "&" 
+“”//升级lv 2
+ "&" 
+“”//升级3级
+ "&");
建筑地图放置(“bD_02”,bD_02);
建筑地图放置(“bD_03”,bD_03);
编辑2:
谢谢,东斯滕克斯!它成功了,我现在可以结束这个主题了。

假设你用建筑扩展了仓库,那么你可以投射“到达仓库”的结果。即
class仓库扩展了建筑

您的地图看起来像:
Map buildingMap=newhashmap()
那你就可以了

更新:安全铸造

Building building = buildingMap.get("A");
if (building instanceof Warehouse) {
    ((Warehouse)building).warehousMethod();
}

地图中的值是建筑类型,所以返回类型对象应该是建筑类型。作为一名开发人员,如果您知道某个特定的密钥绑定到了仓库,请将其键入仓库。((Warehouse)building_map.get(“bD_03”))

如果你有一个
building
s的地图,不是每个物体都必须有一个
仓库。它也可以是
建筑
或其他实现

如果你确定这是一个仓库,那么你可以投下它,就像这样:

Map<String, Building> map = new HashMap<>();
map.put("b", new Building());
map.put("w", new Warehouse());

Warehouse w = (Warehouse) map.get("w");
w.yourMethod();
PS:@Przemyslaw Kruglej建议,如果要在运行时验证泛型集合(如map)中类的实现,可以在强制转换之前使用
instanceof

Building possibleWarehouse = map.get("w");
if (possibleWarehouse instanceof Warehouse) { // true
    Warehouse warehouse = (Warehouse) possibleWarehouse;
}

请阅读java命名约定:名称中没有字符(常量除外)。这不是python;-)请阅读并相应地强化您的问题。你在这里举的例子是不够的,不清楚您要的是什么。请添加您的建筑地图的代码。我已使用建筑地图的代码更新了问题。您必须使用
实例of
检查对象的类型,并将其强制转换到
仓库
另请参阅官方教程开始:如果
建筑地图的值得到(“键”)怎么办
是建筑对象吗?哦,它起作用了!谢谢你的帮助,这就是我要找的东西@你说得对,我刚才举了个例子;-)总是检查你objects@FumyaHero欢迎来到SO。请选择最适合你的解决方案/答案。你能在这篇文章中添加安全铸造吗?这将是最干净的。在类型转换之前也要注意null。+1,但是如果您在本例中提供一些有关
instanceof
用法的信息,以防止
ClassCastException
@PrzemyslawKruglej是的,我可以,但我不想使用这种编码标准。设计一个更好的架构比设计一个糟糕的架构要好,然后围绕它
instanceof
)你是对的。但我当然明白,如果需要的话,
instanceof
是存在的,即使使用另一种设计更好,知道有类似
instanceof
;)的东西仍然很好
Building possibleWarehouse = map.get("w");
if (possibleWarehouse instanceof Warehouse) { // true
    Warehouse warehouse = (Warehouse) possibleWarehouse;
}