在Java中调用HashMap中的Object方法

时间:2011-10-26 04:47:47

标签: java hashmap

我有两个班:卡车和轿车。当某些动作发生时,我想在Truck类的hashMap中添加一个轿车。地图说明了轿车目前在卡车的货物中的含义。我不希望卡车和轿车彼此了解所以我在CarManager中制作了一个方法,轿车可以调用它来传递轿车的ID和轿车想要添加到的卡车的ID。然后CarManager将通知Truck,轿车想要添加到列表中。问题是我不知道CarManager将如何通知卡车以及我应该在addSedan方法中拥有什么。我在CarManager中有一个HashMap,它有一个CarEntities集合。 CarManager无法访问Truck的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");
}

3 个答案:

答案 0 :(得分:1)

如果你不能使用强制转换和instanceof并且必须使用多态,那么在CarEntity界面中添加两个方法:

boolean canBeLoadedWithCars();
void addCar(CarEntity c) throws IllegalStateException;

卡车可以装载汽车,因此通过返回true来实现第一个方法。其他的都返回false。

addCar Truck方法将汽车添加到他们的地图中,而其他实现抛出IllegalStateException,因为它们无法加载汽车。

因此管理器的addCar方法变为

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

答案 1 :(得分:0)

我猜你可以做的一件事是

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

答案 2 :(得分:0)

答案取决于谁在采取行动。如果Sedan将自己添加到卡车中,那么您应该使用addTruck方法将所有卡车添加到经理中。经理会将Truck存储在Map

private Map<String, Truck> trucks = new HashMap<String, Truck>();
public void registerTruck(Truck truck) {
    trucks.put(truck.getId(), truck);
}

然后管理器上的addCar()方法会:

public void addCar(String truckId, CarEntity car) {
    Truck truck = trucks.get(truckId);
    // null handling needed here
    truck.addCar(car);
}

相反,如果卡车拿走了汽车,那么您可以注册汽车。如果您需要两者都是字符串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);
}

通常我们使用Java接口来完成解耦。 Truck类应该能够在不知道它是CarEntity的情况下向其加载Sedan。在这种情况下,addCar(CarEntity car)上的Truck方法听起来不错。 Sedan永远不会知道它位于Truck上,所有卡车都知道通过CarEntity界面公开的方法。在这种情况下,经理可能会离开。