繁体   English   中英

当它们都从同一个类继承时,如何以简单的方式将一个对象投射到另一个对象

[英]How to in a simple way cast one object to another when they both inherit from the same class

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

class Car extends Vehicle
class Train extends Vehicle

假设Vehicle有很多字段 我想将对象Car投射为对象Train。 它们都扩展了Vehicle类,因此它们具有许多共同点。 我不想在设置每个字段上浪费时间。 Java是否有任何方法(也许有一些不错的库?)以最少的努力做到这一点?

PS。 反思可能是答案,但是,如果Vehicle类具有许多更“复杂”类型的字段,则也将花费大量时间。

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

在Java中这是不可能的。 原因是汽车不是火车,即使它们可能具有大多数相同的功能。 如果Train使用方法ChooChoo会发生什么,该方法显然对汽车没有意义,但是您尝试在铸造为Train的Car上调用它。


解决此问题的方法是尝试与Vehicle合作。 如果您当前有一些适用于Trains的代码,但未充分利用Train的特定特性,则可以安全地更改代码以与Vehicle一起使用。 如果它确实利用了Train的详细信息,那么当它通过非Trains时,您希望它如何工作?

请注意, CarTrainVehicle两个不同的具体类,因此您不能在它们之间“投射”。 我猜您想要的是在两个对象之间复制通用属性。 您可以使用ApacheSpring的 bean utils来实现。

您所说的完全可以通过反射mojo来实现; 只需花费很少的精力,就可以编写一个通用的实现,该实现将采用两个不同的类,并尝试按名称/类型匹配字段并相互传递值。 例如, 此问题对您要查找的内容有一些粗略的实现。

但是我认为应该通过继承来处理此问题。 如果CarTrain都是Vehicle但是即使它们之间仍然有些相似,也不能互换,那么您应该创建一个包含所有相似性的Vehicle实现。 然后,您可以从该常见的Vehicle实现中简单地扩展CarTrain类。

例如

class MovingVehicle extends Vehicle //(class which contains similiarities)
class Car extends MovingVehicle
class Train extends MovingVehicle

如果您只想复制公共字段,并且您的对象是bean,请查看Dozer

Mapper mapper = new DozerBeanMapper();
Car car = new Car();
mapper.map(train, car);

如果您的对象不是bean,则必须自己编写映射代码。

PS:确实,“ cast”一词是一个不幸的选择:)

  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); 

编辑:根据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); 

说明: Car car = new Car(existingTrain); 之所以起作用,是因为Car构造函数接受一个Vehicle对象,而Train是一种Vehicle。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM