gpt4 book ai didi

Java泛型以避免ClassCastException

转载 作者:行者123 更新时间:2023-12-01 16:59:28 25 4
gpt4 key购买 nike

这是我正在编写的一段代码。我有一个可以返回指定父类(super class)型的回调对象。 Vehicle 是这里的这些类之一。这些类用作其他类的父类(super class)型,例如此处的 CarTrain

interface CompletionCallBack<Result> {
void onCompletion(Result result);
}

class Vehicle {
Map<String, Object> attributes;
}

class Car extends Vehicle {
public String getMake(){
return attributes.get("make").toString();
}
}

class Train extends Vehicle {
public String getMake(){
return attributes.get("size").toString();
}
}

public class Main {
static void execute(CompletionCallBack<Vehicle> callBack) {
callBack.onCompletion(new Vehicle());
}

public static void main(String[] args) {
execute(new CompletionCallBack<Vehicle>() {
@Override
public void onCompletion(Vehicle result) {
Car car = (Car) result; //Exception
}
});
execute(new CompletionCallBack<Vehicle>() {
@Override
public void onCompletion(Vehicle result) {
Train train = (Train) result; //Exception

}
});
}
}

这里我得到 ClassCastException,因为车辆不能直接转换为汽车或火车。我想调用 execute 给它一个类似 CarTrain 的类型,如下所示:

public class Main {

static void executeGeneric(CompletionCallBack<? extends Vehicle> callBack) {
callBack.onCompletion(new Vehicle()); //compilation error
}

public static void main(String[] args) {
executeGeneric(new CompletionCallBack<Car>() {
@Override
public void onCompletion(Car car) {
//I receive a car here
}
});
}
}

我尝试这样做是因为在我的例子中,Vehicle 包含一个属性映射和一个 Car ,该车辆在该列表中有一些键值对。火车还有其他的。我的 CarTrain 对象提供了简单的 getter,它知道从 Map 检索数据的特定键。

我能够做到这一点的唯一方法是删除父子关系,并围绕我的 TrainCar< 的 Vehicle 构建一个装饰器 类。

最佳答案

问题是您有一个适用于任何车辆的机制,无需区分汽车和火车 - 但您希望汽车和火车有不同的行为。

所以有几种解决方案:

1)拆分机制,以便为汽车和火车提供不同的类型回调

2) 使用多态性 - 在 Vehicle 中提供您在 Car 和 Train 中以不同方式覆盖的方法,并在回调中调用这些方法。

3) 如果所有其他方法都失败,请使用 instanceof 检测对象的实际类型,然后再将其转换为 Car 或 Train。

关于Java泛型以避免ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28814115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com