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:事实上,“演员”这个词是一个不幸的选择:)
// Constructor
public Train(Vehicle v){
// Copy all common variables here
}
// Constructor for Vehicle.java
public Vehicle(Vehicle vehicle){
// Copy all common variables here
}
Car car = new Car();
Train train = new Train(car);
编辑:按照图灵85的建议,将建造商外包给车辆
// Constructor
public Train(Vehicle v){
// Copy all common variables here
}
// Constructor for Vehicle.java
public Vehicle(Vehicle vehicle){
// Copy all common variables here
}
// 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);
编辑: