我有以下问题。假设我有以下两个类(class):骑山地自行车。在 MountainBike 的 header 中,我声明:public class MountainBike extends Bicycle
。 MountainBike 类添加了两个在 Bicycle 中不存在的字段。因为我一个一个地添加属性(因为我正在使用数据库),所以没有构造函数,而是一个函数,它在给定字符串标识符和值的情况下设置属性。我知道有可能并非所有属性都已设置并且可能为空,但这对我来说没问题。
现在问题如下。在给定的时间点,我知道它是什么类型的自行车,它是其中一个领域。我想做的是:一旦我知道这个 Bicycle 对象实际上是 MountainBike,我想将它转换为 MountainBike:MountainBike mb = (MountainBike) bicycle
,但是这会导致运行时 java.lang.ClassCastException:Bicycle cannot be cast to MountainBike。
我确信这是可能的(无需使用以整辆自行车作为参数的构造函数)。我该怎么做?
谢谢!
赫克托
最佳答案
就像 Jon Skeet 在他的评论中所说的那样,如果它不是 MountainBike
而只是一辆普通的 Bicycle
,则不能施放它。您可以做的是在 MountainBike
中创建一个构造函数,它将 Bicycle
作为参数:
public MountainBike(Bicycle bicycle) {
// Copy bicycle's properties
}
改为调用它:
MountainBike mb = new MountainBike(Bicycle bicycle);
如果您出于某种原因无法修改MountainBike
类,您还可以创建一个static
工厂方法:
public class MountainBikeFactory {
public static MountainBike createMountainBike(Bicycle bicycle) {
MountainBike mb = new MountainBike();
// Copy bicycle's properties
return mb;
}
}
并调用它:
MountainBike mb = MountainBikeFactory.create(bicycle);
编辑:在查看您作为问题评论发布的信息后,您似乎可以尝试构建器模式。构建器会将所有属性作为变量包含(是的,它将有 100 多个变量)并且当您从文件中发现属性时,将它们设置在构建器上。然后,最后,当您调用构建器的 build()
方法时,让它解析要创建哪种类型的自行车,并使用多态性来处理 w.r.t. 属性组。你创造了哪辆自行车。
例如:
public class BikeBuilder {
private String model;
private String wheelSize;
private String shocks;
private String racingHandleBarType;
// returns "this" so you can chain calls, common in builders, not necessary
public BikeBuilder setModel(String model) {
this.model = model;
return this;
}
// Other setters
public Bike build() {
Bike bike;
// Determine which kind of bike it is and create it
if (shocks != null) {
bike = new MountainBike();
handleMountainBike((MountainBike) bike);
} else if (racingHandleBarType != null) {
bike = new RacingBike();
handleRacingBike((RacingBike) bike);
} else {
bike = new Bike();
}
handleCommonAttributes(bike);
return bike;
}
// All bikes have these attributes
private void handleCommonAttributes(Bike bike) {
bike.setModel(model);
bike.setWheelSize(wheelSize);
}
private void handleMountainBike(MountainBike bike) {
bike.setShocks(shocks);
}
private void handleRacingBike(RacingBike bike) {
bike.setRacingHandleBarType(racingHandleBarType);
}
}
这使您可以即时构建自行车并在阅读文件结束时而不是开始时确定其类型。它充当一种容器。如果您有多个扩展 Bike
的类型,您可以为它们创建新方法。这至少会让您入门。
关于java - 类型转换为更具体的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14818486/