如何投射不相互继承的对象?

时间:2017-07-31 07:36:16

标签: java object casting

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

a = '87101108991111091013211611132112121116104111110'
data = map(int, filter(None, re.split("([3-9][0-9]|1[0-2][0-9])", a)))
''.join(chr(i) for i in data)
#=>'Welcome to python'

如果对象class A{ private int a; private int b; } class B{ private int a; private int b; } 具有A和B类的所有属性,有没有办法单独转换它们?

2 个答案:

答案 0 :(得分:5)

从孩子到父母的投射(向下投射)或反之亦然(向上投射):

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

或在接口的情况下:

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

施法时要小心 - 如果无法施法,你会收到Exception

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

例如:

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
    }
}

答案 1 :(得分:3)

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

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

例如ModelMapper

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

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