4

我有四门课:

public class A { }
public class B extends A { }
public class C extends B { }
public class D extends B { }

从我在推土机文档中读到的关于继承的内容,它必须非常简单,我需要将超类相互映射,以及子类。这是它在 xml 中的外观:

<mapping>
<class-a>foo.A</class-a>
<class-b>foo.bar.A</class-b>
</mapping>

<mapping>
<class-a>foo.B</class-a>
<class-b>foo.bar.B</class-b>
</mapping>

<mapping>
<class-a>foo.C</class-a>
<class-b>foo.bar.C</class-b>
</mapping>

<mapping>
<class-a>foo.D</class-a>
<class-b>foo.bar.D</class-b>
</mapping>

所有这些类都是相同的,我的意思是 D 和 D 具有相同的属性,C 和 C 等等。

问题: 在我传递给推土机的对象中,我有一个 B 类型的属性,它可以由 C 或 D(多态性)初始化。当推土机返回新的映射对象时,它总是返回 B 的属性类型给我,而不是 C 或 D。如何解决这个问题?

4

2 回答 2

1

请看一下继承映射部分。您可以将此类映射用于具有子类的字段类。

<mapping>
    <class-a>foo.Source</class-a>
    <class-b>foo.Dest</class-b>
    <field>
      <a>attr</a>
      <b>attr</b>
      <a-hint>foo.B, foo.C, foo.D</a-hint>
      <b-hint>foo.bar.B, foo.bar.C, foo.bar.D</b-hint>
   </field>
</mapping>

编辑:我实现了某种类型的自动多态功能请求。我认为,它将包含在下一个 Dozer 版本中。

于 2013-01-09T14:32:31.530 回答
0

-我认为你需要一个explicit cast.

例如:

B b = new C();

go(b)

//////////Called Method////////////////

public void go(B bx){

    C c = (C) bx;

}
于 2013-01-08T10:42:40.767 回答