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