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

问题描述 投票:2回答:3

我做了两个课 - BuildingWarehouseWarehouse延伸Building。我创建了Building地图(building_map),在那里我放置了Building对象和Warehouse对象。我想通过使用地图获得Warehouse的方法,但我只能看到来自Building类的东西。

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);                      

编辑2:谢谢,TungstenX!它有效,我现在可以关闭这个话题。

java polymorphism parent-child
3个回答
0
投票

假设您使用Building扩展Warehouse,您可以将get的结果转换为仓库。我是class Warehouse extends Building

你的地图看起来像:Map<String, Building> buildingMap = new HashMap<>();然后就可以了

更新:安全铸造

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

2
投票

如果你有一张Buildings地图,不是每个物体都必须有一个Warehouse。它也可以是Building或其他实现。

如果您确定它是仓库,那么您可以投射它,如下所示:

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

Warehouse w = (Warehouse) map.get("w");
w.yourMethod();

但请记住,有人可以像Bulding那样放一个孩子的另一个例子

class OtherClass extends Building {}
map.put("b", new Building());
map.put("w", new Warehouse());
map.put("o", new OtherClass());

Warehouse w = (Warehouse) map.get("b");  // ClassCastException
Warehouse w = (Warehouse) map.get("o");  // ClassCastException

PS:正如@Przemyslaw Kruglej建议的那样,如果你想在运行时验证泛型集合(如map)中的类的实现,你可以在转换之前使用instanceof

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

0
投票

map中的值是Building类型,因此返回类型Object应该是构建类型。如果作为开发人员,您知道特定密钥绑定到仓库,而不是将其强制转换为仓库。 ((仓库)building_map.get(“bD_03”))

© www.soinside.com 2019 - 2024. All rights reserved.