Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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,我有两个班:卡车和轿车。当发生某些操作时,我想在Truck类中将sedan添加到hashMap中。地图显示了卡车货物中目前有哪些轿车。我不想让卡车和轿车相互了解,所以我在CarManager中创建了一个方法,Sedan可以调用该方法来传递轿车的id和轿车想要添加到的卡车的id。然后,CarManager将通知卡车一辆轿车要添加到列表中。问题是,我不知道CarManager将如何通知卡车,以及我应该如何使用addSedan方法。我在CarManager中有一个HashMap,它有一系列的注意事项。

我有两个班:卡车和轿车。当发生某些操作时,我想在Truck类中将sedan添加到hashMap中。地图显示了卡车货物中目前有哪些轿车。我不想让卡车和轿车相互了解,所以我在CarManager中创建了一个方法,Sedan可以调用该方法来传递轿车的id和轿车想要添加到的卡车的id。然后,CarManager将通知卡车一辆轿车要添加到列表中。问题是,我不知道CarManager将如何通知卡车,以及我应该如何使用addSedan方法。我在CarManager中有一个HashMap,它有一系列的注意事项。CarManager无法访问卡车的addCar方法,因为它不在接口中,我不想将其添加到接口中,因为并非所有CarEntity都会使用它。有人能帮忙吗

public interface CarEntity {
    String getId();
    double getSpeed();
    void move();
}

public class CarManager {
    private HashMap<String, CarEntity> hash = new HashMap<String, CarEntity>();
    public void addSedan(String carId, String truckId) {
    ???
    hash.get(truckId).addCarr(carId); //I don't think this will work
    }

}

public class Truck implements CarEntity { 
    private HashMap<String, CarEntity> cargo = new HashMap<String, CarEntity>();
    public void addCar(String id, CarEntity ce) {
        cargo.put(id,ce);
}

public class Sedan implements CarEntity {
    CarManager.addSedan("Car 1", "Truck 5");
}
公共接口关注度{
字符串getId();
双getSpeed();
无效移动();
}
公共类管理器{
私有HashMap hash=newhashmap();
公共无效addSedan(字符串carId、字符串truckId){
???
hash.get(truckId.addCarr(carId);//我认为这行不通
}
}
公共类卡车实现CarEntity{
私有HashMap cargo=newhashmap();
public void addCar(字符串id,CarEntity ce){
货物。放置(id,ce);
}
公共级轿车实行谨慎{
CarManager.addSedan(“1号车”、“5号卡车”);
}

我想你能做的一件事就是

CarEntity t = hash.get(truckId); 
if (t instanceof Truck)
   downcast car entity to truck
   call add car method

答案取决于谁在执行操作。如果
轿车
s将自己添加到卡车上,那么您应该有一个
addTruck
方法,将所有卡车添加到管理器中。管理器将
卡车
存储在
地图

private Map<String, Truck> trucks = new HashMap<String, Truck>();
public void registerTruck(Truck truck) {
    trucks.put(truck.getId(), truck);
}
相反,如果卡车占用了这些汽车,那么您可以注册这些汽车。如果您需要同时使用字符串id,那么您需要同时注册汽车和卡车,并执行以下操作:

private Map<String, Truck> trucks = new HashMap<String, Truck>();
private Map<String, Sedan> sedans = new HashMap<String, Sedan>();

public void registerTruck(Truck truck) {
    trucks.put(truck.getId(), truck);
}
public void registerSedan(Sedan sedan) {
    sedans.put(sedan.getId(), sedan);
}

public void addSedan(String sedanId, String truckId) {
    Sedan sedan = sedans.get(sedanId);
    Truck truck = trucks.get(truckId);
    // null handling needed here
    truck.addCar(sedan);
}
private Map trucks=new HashMap();
私有映射sedans=newhashmap();
公共无效登记卡车(卡车){
trucks.put(truck.getId(),truck);
}
公共无效登记证持有人(轿车){
sedans.put(sedan.getId(),sedan);
}
公共无效添加sedan(字符串sedanId、字符串truckId){
Sedan Sedan=sedans.get(sedanId);
卡车=trucks.get(truckId);
//此处需要空处理
卡车、汽车(轿车);
}

通常我们使用Java接口来实现解耦。
Truck
类应该能够向其负载添加
CarEntity
,而不知道它是一辆
轿车
Truck
上的方法听起来不错。
Sedan
永远不会知道它在
Truck
上,Truck知道的都是通过
CarEntity
界面公开的方法。在这种情况下,经理可能会离开。

如果不能使用cast和instanceof,并且必须使用多态性,那么添加两种方法s到您的CarEntity界面:

boolean canBeLoadedWithCars();
void addCar(CarEntity c) throws IllegalStateException;
卡车可以装载汽车,因此通过返回true实现第一种方法,其他方法返回false

Truck
addCar
方法将汽车添加到地图中,而其他实现则抛出一个非法状态异常,因为它们无法加载汽车

因此,管理器的
addCar
方法变为

CarEntity truck = hashMap.get(truckId);
if (truck.canBeLoadedWithCars() {
    truck.addCar(sedan);
}

我不能使用它。我不赞成使用Casting。我仍然有点困惑。trucks HashMap在哪里?在CarManager中?因为我试图将Sedan添加到Truck类的HashMap中,而不是CarManager。如果您只想在manager中将
Sedan
s和
Truck
s作为字符串ID引用,那么manager必须从truckId->truck和sedanId->
Sedan
进行映射。在
truck
中仍然会有
CarEntity
对象的集合。哦,而且您不需要
truck.addCar()上的id字段。
。它应该调用
getId()
的CarEntity上
对不起,我还是有点困惑。在addSedan()中,
truck.addCar(sedan);
这是truck的拼写错误吗?在我的情况下应该是
cargo.addCar(sedan);
吗?你已经找到了答案,但我想我还是会回答的。
addSedan()
方法位于管理器中。它定位truck和sedan实例,然后调用
truck.addCar(sedan)
。在
truck.addCar()
方法中,它执行
cargo.put(car.getId(),car)
。但是我遇到了一个问题,当truck只需要这些方法时,所有CarEntity都需要实现这些方法。这些方法的实现非常简单。只需要一行代码。但是您可以从AbstractCarEntity类继承默认实现,并且只在truck类中重写它们。但是,拥有这些方法不是很糟糕的设计吗当只有一个类使用接口中的某些方法时?不。这不一定是糟糕的设计。你可能会在以后引入一台拖拉机,它也可以装载汽车,你的设计不会发生任何变化,而使用instanceof和Cast则不会。这就是多态性的美妙之处。我明白了。这是我最初的意图,但不应该是ot她的实现addCar的类是空的,比如
void addCar(CarEntity c){}
?您所指的那一行代码是什么?
CarEntity truck = hashMap.get(truckId);
if (truck.canBeLoadedWithCars() {
    truck.addCar(sedan);
}