如何以一种简单的方式将一个对象转换为另一个对象,当它们都从同一个类继承时

时间:2016-10-21 08:19:00

标签: java inheritance

我有一个问题。 例如,让我们考虑两个类:

class Car extends Vehicle
class Train extends Vehicle

我们假设车辆有很多字段。 我想将对象Car转换为对象Train。它们都扩展了Vehicle类,因此它们有许多共同的字段。我不想浪费时间设置每个领域。 Java中是否有任何方法(可能是一些不错的库?)以最少的努力完成它?

PS。 然而,反射可能是答案,如果车辆类有许多更复杂的领域。打字它也需要很多时间。

编辑: 我想基于另一个对象的公共字段创建一个对象。也许'演员'这个词是错的。是的,我知道它们不同,我只是想复制常见的字段。是的,我知道这是一个糟糕的设计,我只是没有其他选择,我需要快速修复那些写得不好的东西。

5 个答案:

答案 0 :(得分:3)

在Java中这是不可能的。原因是汽车不是火车,即使它们的大部分功能都是共同的。如果火车有一个方法ChooChoo会发生什么事情,这对于一辆汽车来说显然没有意义,但是你试图用一辆作为火车的汽车来称呼它。

解决这个问题的方法是尝试使用Vehicle。如果您当前有一些与火车有关的代码,但没有使用火车细节,那么更改代码以使用Vehicle应该是安全的。 如果它确实使用了火车细节,那么当它通过非火车时你如何期望它能够工作?

答案 1 :(得分:2)

请注意,CarTrainVehicle的两个不同具体类,因此您无法在它们之间“强制转换”。我想你想要的是复制两个对象之间的公共属性。您可以使用ApacheSpring中的bean util来执行此操作。

答案 2 :(得分:0)

你所说的绝对是可能有一些反思魔力;只需很少的努力就可以编写一个通用的实现,它将采用两个不同的类,并尝试按名称/类型匹配字段,并相互传递值。 例如this question有一些粗略的实现你正在寻找的东西。

但我认为你应该处理这个问题的方法是继承。如果CarTrain都是Vehicle,但即使它们之间仍有一些相似之处,它们也无法互换,那么您应该创建一个Vehicle实现,其中包含所有相似之处。然后,您只需从常规Car实施中扩展TrainVehicle类。

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)

  1. 在Train类中创建一个接受Vehicle作为参数的新构造函数。此构造函数将复制Vehicle中的所有字段。

    // Constructor
    public Train(Vehicle v){
        // Copy all common variables here
    }
    
  2. 您现在可以从现有的Car对象中实例化Train对象

    Car car = new Car();
    Train train = new Train(car);
    
  3. 编辑:按照Turing85

    的建议将构造函数外包给Vehicle
    1. 在Vehicle类中创建一个接受Vehicle作为参数的新构造函数。此构造函数将复制Vehicle中的所有字段。

      // Constructor for Vehicle.java
      public Vehicle(Vehicle vehicle){
          // Copy all common variables here
      }
      
    2. 在您的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);
      }
      
    3. 现在,您可以通过使用现有对象实例化对象来复制公共字段。

      // 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);
      
    4. 说明:Car car = new Car(existingTrain);有效,因为Car构造函数接受Vehicle对象,而Train是一种Vehicle。