Java 如何投射不带';我们不能互相继承吗?

Java 如何投射不带';我们不能互相继承吗?,java,object,casting,Java,Object,Casting,我有两个具有不同字段的不同类和一个具有两个类的所有字段的类。有没有办法将对象投射到两个单独的对象中 class A{ private int a; private int b; } class B{ private int a; private int b; } 如果对象D具有A类和B类的所有属性,有没有办法将它们分别强制转换?强制转换从子级转换到父级(向下转换),或者反之亦然(向上转换): 或在接口的情况下: List<String> myLi

我有两个具有不同字段的不同类和一个具有两个类的所有字段的类。有没有办法将对象投射到两个单独的对象中

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

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

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

强制转换从子级转换到父级(向下转换),或者反之亦然(向上转换):

或在接口的情况下:

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

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

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

例如,使用
ModelMapper

  ModelMapper mapper = new ModelMapper();
  A a = new A(....);
  B b = mapper.map(a, B.class)
有些库非常高效(Selma、MapStruct、JMapper)。大多数都是在编译时生成代码的
其他的效率较低

因此,在推广使用此类库之前,您应该评估这一点、要映射的对象的大小和映射频率。

不,不可能。Java中没有多重继承。需要使用接口进行重构。否。在这里,如果两者都有共同的属性,它们可能有某种关系。比如,
B扩展A
d扩展A,其中A已经扩展了B。在这种情况下,你可以有d,它具有A和B的所有属性。你需要修改如下内容。若要使B独立于A,那个么类只能扩展一个类。所以这是不可能的。对
A
B
使用接口而不是类怎么样?因此,您的目标对象可以实现两个接口
C实现A、B
@MincongHuang我不建议基于字段共享接口…不仅Java允许向下和向上播放,而且它们都是有用的
BeanUtils
等实用程序可以帮助
BeanUtils.copyProperties(origin,target)@SharonBenAsher我想现在可以了,但是请随意edit@DavidP是的,有,但我不想推荐外部图书馆。如果有必要,我会推荐MapStruct:)@SharonBenAsher我不同意。降级通常是糟糕设计的症状。MapStruct是我的最爱,因为它不使用反射-它只是根据接口生成源。免责声明:我对MapStruct做出了贡献,但仅限于示例,当我努力自己找到一个示例时:)MapStruct的著名优势:)我曾经使用过它,但由于兼容性问题,最终我没有机会使用它。
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
    }
}
  ModelMapper mapper = new ModelMapper();
  A a = new A(....);
  B b = mapper.map(a, B.class)