【问题标题】:How can I cast objects that don't inherit each other?如何转换不相互继承的对象?
【发布时间】:2017-07-31 07:36:15
【问题描述】:

我有 2 个具有不同字段的不同类和一个具有两个类的所有字段的类。有没有办法将对象转换为两个单独的对象?

class A{
    private int a;
    private int b;
}

class B{ 
    private int a;
    private int b;
}

如果对象D具有A类和B类的所有属性,有没有办法分别转换?

【问题讨论】:

  • 不,不可能。 Java 中没有多重继承。需要使用接口进行重构。
  • No.这里如果两者有共同的属性,他们可能有一些关系。喜欢,B extends A
  • d 扩展了 A,其中 A 已经扩展了 b。在这种情况下,您可以拥有 d,它具有 A 和 B 的所有属性。您需要修改类似这样的内容。如果你想让B独立于A,那么class只能扩展一个类。所以这是不可能的。
  • AB 使用接口而不是类呢?所以你的目标对象可以实现两个接口C implements A, B
  • @MincongHuang 我不推荐基于字段共享界面...

标签: java object casting


【解决方案1】:

从孩子到父母(向下转型)或反之亦然(向上转型):

class A extends B
B b = (B)(new A());

或者在接口的情况下:

List<String> myList = new ArrayList<>();
ArrayList<String> myArrayList = (ArrayList)myList;

投射时要小心 - 如果无法投射,您将收到Exception

在您的情况下,mapping 是您正在寻找的。你只需要一个映射器。

例如:

public class AToBMapper {
    public static A fromB(B b) {
        A a = new A();
        a.setA(b.getA());
        a.setB(b.getB());
        return a;
    }

    public static B fromA(A a) {
        //fill in
    }
}

【讨论】:

  • 不仅Java允许向下转换和向上转换,它们都很有用
  • BeanUtils这样的实用程序可以帮助BeanUtils.copyProperties(origin, target);
  • @SharonBenAsher 我认为现在还可以,但请随时编辑
  • @DavidPérezCabrera 是的,但我不想推荐外部库。如果必须,我会推荐 MapStruct :)
  • @SharonBenAsher 我不同意。 沮丧通常是糟糕设计的征兆。
【解决方案2】:

作为 xenteros 非常好的答案的补充,如果您必须为许多类重复此任务,您也可以使用库来完成。

Spring、apache-commons 和许多其他工具类都提供了实用程序类来逐个字段地复制其中一个在两个类之间具有相同名称和类型:

例如ModelMapper

  ModelMapper mapper = new ModelMapper();
  A a = new A(....);
  B b = mapper.map(a, B.class)

一些库非常高效(Selma、MapStruct、JMapper)。他们中的大多数在编译时生成代码
其他的效率较低。
在推广此类库的使用之前,您应该评估这一点、要映射的对象的大小和映射频率。

【讨论】:

  • MapStruct 是我最喜欢的,因为它不使用反射——它只是根据接口生成源。免责声明:我为 MapStruct 做出贡献,但只是为示例做出贡献,当我自己努力寻找示例时 :)
  • MapStruct 的著名优势 :) 我不得不一次使用它,但最后因为兼容性问题我没有机会。
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2013-10-16
  • 1970-01-01
相关资源
最近更新 更多