我做了两个课 - Building
和Warehouse
。 Warehouse
延伸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!它有效,我现在可以关闭这个话题。
假设您使用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();
}
如果你有一张Building
s地图,不是每个物体都必须有一个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;
}
map中的值是Building类型,因此返回类型Object应该是构建类型。如果作为开发人员,您知道特定密钥绑定到仓库,而不是将其强制转换为仓库。 ((仓库)building_map.get(“bD_03”))