我试图通过标签一般地获得车辆。为什么我不能使用通用Collection
类型来获取车辆? CarTypeTags
和TruckTypeTags
是CarType
类和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>();
}
答案 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 应该是两件事之一:
在我编写此示例时,我发现您看到的类型不匹配错误可能与您的CarTypeTags
数组的内容有关。看起来您的TruckTag地图包含卡车的集合,而您的CarTag地图仅包含单个汽车。如果types
是一个集合而CarTypeTags
包含汽车(不是汽车的集合),那么该行将无效。
无论哪种方式,从您的示例代码中可以清楚地看出,您并不完全了解Java中如何使用泛型。你永远不应该在一般方法中比较类或使用instanceof
方法(非常非常罕见)。
也...
您应该在Java中使用小写字母开始所有对象的名称!