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

Java 当一个对象和另一个对象都从同一个类继承时,如何以简单的方式将它们强制转换为另一个对象,java,inheritance,Java,Inheritance,我有个问题。 例如,让我们考虑两个类: class Car extends Vehicle class Train extends Vehicle 让我们假设车辆有很多字段。 我想把目标车抛给目标火车。它们都扩展了Vehicle类,因此它们有许多共同的字段。我不想在设置每个字段上浪费时间。在Java中有什么方法(可能是一些很好的库?)可以用最少的努力来实现它吗 附言。 反射可能是答案,但是,如果Vehicle类有许多更“复杂”类型的字段,那么它也需要很多时间 编辑: 我想基于另一个对象的公共字

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

class Car extends Vehicle
class Train extends Vehicle
让我们假设车辆有很多字段。 我想把目标车抛给目标火车。它们都扩展了Vehicle类,因此它们有许多共同的字段。我不想在设置每个字段上浪费时间。在Java中有什么方法(可能是一些很好的库?)可以用最少的努力来实现它吗

附言。 反射可能是答案,但是,如果Vehicle类有许多更“复杂”类型的字段,那么它也需要很多时间

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

这在Java中是不可能的。原因是汽车不是火车,尽管它们的大部分功能可能是相同的。如果火车上有一种方法
choocoo
,这显然对汽车没有意义,但你试着在铸造为火车的汽车上调用它,会发生什么


解决这个问题的方法是尝试使用车辆。如果您目前有一些适用于列车的代码,但没有使用列车的具体信息,则将代码更改为适用于车辆应该是安全的。
如果它确实利用了火车的细节,那么当它通过非火车时,您希望它如何工作?

这在Java中是不可能的。原因是汽车不是火车,尽管它们的大部分功能可能是相同的。如果火车上有一种方法
choocoo
,这显然对汽车没有意义,但你试着在铸造为火车的汽车上调用它,会发生什么


解决这个问题的方法是尝试使用车辆。如果您目前有一些适用于列车的代码,但没有使用列车的具体信息,则将代码更改为适用于车辆应该是安全的。
如果它确实利用了列车的具体情况,那么当它通过非列车时,您希望它如何工作?

请注意,
Car
Train
Vehicle
的两个不同的具体类别,因此您不能在它们之间“转换”。我猜您想要的是复制两个对象之间的公共属性。您可以使用bean utils从或执行此操作。

请注意,
Car
Train
Vehicle
的两个不同的具体类别,因此您不能在它们之间“转换”。我猜您想要的是复制两个对象之间的公共属性。您可以使用bean utils从或来实现这一点。

您所说的完全可以通过一些反射魔咒实现;只要稍加努力,就可以编写一个通用实现,它将采用两个不同的类,并尝试按名称/类型匹配字段,并相互传递值。 例如,对您正在寻找的内容进行一些粗略的实现

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

e、 g


你所说的肯定是可能的,因为你有一些思考的魔力;只要稍加努力,就可以编写一个通用实现,它将采用两个不同的类,并尝试按名称/类型匹配字段,并相互传递值。 例如,对您正在寻找的内容进行一些粗略的实现

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

e、 g


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

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


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

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

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

PS:事实上,“演员”这个词是一个不幸的选择:)

  • 在Train类中创建一个新的构造函数,该构造函数接受车辆作为参数。此构造函数将复制车辆中存在的所有字段

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

    Car car = new Car();
    Train train = new Train(car);
    

  • 编辑:按照图灵85的建议,将建造商外包给车辆
  • 在Vehicle类中创建一个新的构造函数,该构造函数接受Vehicle作为参数。此构造函数将复制车辆中存在的所有字段

    // Constructor
    public Train(Vehicle v){
        // Copy all common variables here
    }
    
    // Constructor for Vehicle.java
    public Vehicle(Vehicle vehicle){
        // Copy all common variables here
    }
    
  • 在Train/Car类中创建一个新的构造函数,该构造函数接受车辆作为参数并调用super(车辆)

  • 现在可以通过使用现有对象实例化对象来复制公共字段

    // 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);
    
  • 说明:
    轿厢=新车(现有列车)之所以起作用,是因为汽车构造师接受一个车辆对象,而火车是一种车辆类型

  • 在Train类中创建一个新的构造函数,该构造函数接受车辆作为参数。此构造函数将复制车辆中存在的所有字段

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

    Car car = new Car();
    Train train = new Train(car);
    

  • 编辑: