1

我试图通过标签一般地获取车辆。为什么我不能使用泛型Collection来获取车辆?CarTypeTagsandTruckTypeTagsCarType类和类的哈希图,从字符串(标签)索引TruckType扩展而来。VehicleType有没有办法让我将分配给类型集合的汽车或卡车归还?

奖励:是否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>();
}
4

2 回答 2

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()应该做什么等我无法准确地重现您的用例。

至于你的奖金问题:不。您可以通过查看堆栈跟踪(缓慢、丑陋和脆弱)或在令牌中显式传递它来获取调用者的类。

于 2013-06-17T20:55:26.503 回答
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. Cars 和 Trucks 都扩展的类
  2. Cars 和 Trucks 都实现的接口

在我编写此示例时,我想到您看到的类型不匹配CarTypeTags错误可能与数组的内容有关。看起来您的 TruckTag 地图包含卡车的集合,而您的 CarTag 地图仅包含单个汽车。如果types是一个集合并且CarTypeTags包含汽车(不是汽车的集合),那么该行将不起作用。

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

还...

在 Java 中,所有对象的名称都应该以小写字母开头!

于 2013-06-17T20:09:24.340 回答