我有一个问题。 例如,让我们考虑两个类:
class Car extends Vehicle
class Train extends Vehicle
我们假设车辆有很多字段。 我想将对象Car转换为对象Train。它们都扩展了Vehicle类,因此它们有许多共同的字段。我不想浪费时间设置每个领域。 Java中是否有任何方法(可能是一些不错的库?)以最少的努力完成它?
PS。 然而,反射可能是答案,如果车辆类有许多更复杂的领域。打字它也需要很多时间。
编辑: 我想基于另一个对象的公共字段创建一个对象。也许'演员'这个词是错的。是的,我知道它们不同,我只是想复制常见的字段。是的,我知道这是一个糟糕的设计,我只是没有其他选择,我需要快速修复那些写得不好的东西。
答案 0 :(得分:3)
在Java中这是不可能的。原因是汽车不是火车,即使它们的大部分功能都是共同的。如果火车有一个方法ChooChoo
会发生什么事情,这对于一辆汽车来说显然没有意义,但是你试图用一辆作为火车的汽车来称呼它。
解决这个问题的方法是尝试使用Vehicle。如果您当前有一些与火车有关的代码,但没有使用火车细节,那么更改代码以使用Vehicle应该是安全的。 如果它确实使用了火车细节,那么当它通过非火车时你如何期望它能够工作?
答案 1 :(得分:2)
请注意,Car
和Train
是Vehicle
的两个不同具体类,因此您无法在它们之间“强制转换”。我想你想要的是复制两个对象之间的公共属性。您可以使用Apache或Spring中的bean util来执行此操作。
答案 2 :(得分:0)
你所说的绝对是可能有一些反思魔力;只需很少的努力就可以编写一个通用的实现,它将采用两个不同的类,并尝试按名称/类型匹配字段,并相互传递值。 例如this question有一些粗略的实现你正在寻找的东西。
但我认为你应该处理这个问题的方法是继承。如果Car
和Train
都是Vehicle
,但即使它们之间仍有一些相似之处,它们也无法互换,那么您应该创建一个Vehicle
实现,其中包含所有相似之处。然后,您只需从常规Car
实施中扩展Train
和Vehicle
类。
e.g
class MovingVehicle extends Vehicle //(class which contains similiarities)
class Car extends MovingVehicle
class Train extends MovingVehicle
答案 3 :(得分:0)
如果您只想复制公共字段,并且对象是bean,请查看Dozer。
Mapper mapper = new DozerBeanMapper();
Car car = new Car();
mapper.map(train, car);
如果您的对象不是bean,那么您必须自己编写映射代码。
PS:确实,“演员”这个词是一个不幸的选择:)答案 4 :(得分:0)
在Train类中创建一个接受Vehicle作为参数的新构造函数。此构造函数将复制Vehicle中的所有字段。
// Constructor
public Train(Vehicle v){
// Copy all common variables here
}
您现在可以从现有的Car对象中实例化Train对象
Car car = new Car();
Train train = new Train(car);
在Vehicle类中创建一个接受Vehicle作为参数的新构造函数。此构造函数将复制Vehicle中的所有字段。
// Constructor for Vehicle.java
public Vehicle(Vehicle vehicle){
// Copy all common variables here
}
在您的Train / Car类中创建一个新的构造函数,该构造函数接受Vehicle作为参数并调用super(vehicle)。
// Constructor for Car.java
public Car(Vehicle vehicle){
super(vehicle);
}
// Constructor for Train.java
public Train(Vehicle vehicle){
super(vehicle);
}
现在,您可以通过使用现有对象实例化对象来复制公共字段。
// Creating a new Train from an existing car object
Car existingCar = new Car();
Train train = new Train(existingCar);
// Creating a new Car from an existing Train object
Train existingTrain = new Train();
Car car = new Car(existingTrain);
说明:Car car = new Car(existingTrain);
有效,因为Car构造函数接受Vehicle对象,而Train是一种Vehicle。