如何使用<t> Generic Type?</t>使用现有的HashMaps

时间:2013-06-17 19:40:31

标签: java generics hashmap

我试图通过标签一般地获得车辆。为什么我不能使用通用Collection类型来获取车辆? CarTypeTagsTruckTypeTagsCarType类和TruckType类的哈希映射,它们从VehicleType扩展为string(tag)。有没有办法让汽车或卡车分配到类型集合并返回它?

加分:clazz.getClass()是否将调用者的类返回给此方法?

public <T> Collection<T> getVehicleByTag(String tag) {
        T clazz;
        Collection<T> types;
        if (clazz.getClass() == Car.class) {
            types = (CarTypeTags.get(tag)); // error here: type mismatch
        } else if (clazz.getClass() == Truck.class) {
            types.addAll(TruckTypeTags.get(tag)); // error here too
        } 
        if (types != null) {
            return types;
    }
    return new ArrayList<T>();
}

2 个答案:

答案 0 :(得分:2)

大肆猜测你的目标是什么,你想在某个地方使用某种类型的令牌:

class Vehicle {
    String tag;
}

class Car extends Vehicle { ... }

class Truck extends Vehicle { ... }

class Tag<T> {
    Class<T> tagType;
    String tagName;
}


List<Vehicle> vehicles = new ArrayList<Vehicle>();

vehicles.add(new Car("tag1"));
vehicles.add(new Truck("tag1"));
vehicles.add(new Car("tag2"));
vehicles.add(new Truck("tag2"));

public <T> List<T> getVehiclesByTag(Tag<T> tag) {
    List<T> result = new ArrayList<>();
    for (Vehicle vehicle : vehicles) {
        if (tag.tagType.isInstance(vehicle) && tag.tagName.equals(vehicle.tag))) {
            result.add(tag.tagType.cast(vehicle));
        }
    }
    return result;
}

(为简洁起见省略了构造函数,属性等。)

以上内容将过滤标签名称和预期的返回类型。如果单个代码只应映射到一种车型,则可以省略isInstance()支票。

显然,代码更多的是您需要使用哪些函数的示例 - 因为我不知道CarTypeTags.get()等应该做什么我无法完全重现您的用例。

就奖金问题而言:不。您可以通过查找堆栈跟踪(缓慢,丑陋和易碎)或通过在令牌中显式传递来获取调用者的类。

答案 1 :(得分:1)

很难知道在没有看到更多代码的情况下发生了什么......

但看起来你的方法应该做这样的事情:

public Collection<Vehicle> getVehicleByTag(String tag) {
    if (carTypeTags.containsKey(tag)) {
        return carTypeTags.get(tag);
    }
    else if (truckTypeTags.containsKey(tag)) {
        return truckTypeTags.get(tag);
    }
    else {
        return new ArrayList<Vehicle>();
    }
}

在上面的代码中, Vehicle 应该是两件事之一:

  1. 汽车和卡车延伸的课程
  2. 汽车和卡车实施的界面
  3. 在我编写此示例时,我发现您看到的类型不匹配错误可能与您的CarTypeTags数组的内容有关。看起来您的TruckTag地图包含卡车的集合,而您的CarTag地图仅包含单个汽车。如果types是一个集合而CarTypeTags包含汽车(不是汽车的集合),那么该行将无效。

    无论哪种方式,从您的示例代码中可以清楚地看出,您并不完全了解Java中如何使用泛型。你永远不应该在一般方法中比较类或使用instanceof方法(非常非常罕见)。

    也...

    您应该在Java中使用小写字母开始所有对象的名称!