在Android中使用MapStruct来映射泛型类型?

时间:2017-07-21 23:59:50

标签: java android generics mapping mapstruct

我有一个场景,我必须使用MapStructResource个对象(来自网络请求)转换为RealmObject个对象(数据层)来处理对象映射。我正在尝试创建一个通用的Mapper接口,以防止为每个资源定义自定义映射器,如下所示:

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import io.realm.RealmObject;
import moe.banana.jsonapi2.Resource;

@Mapper
public interface ResourceMapper <T extends Resource, I extends RealmObject> {
    ResourceMapper INSTANCE = Mappers.getMapper(ResourceMapper.class);

    I resourceToRealm(T resource);
}

但这会导致构建错误(但编译成功):

  

错误:(13,4)错误:无法为泛型类型生成映射方法   变量来源。

这不可能吗?如果没有,我将不得不为每个Resource创建一个自定义映射器,并使用switch告诉反序列化器哪个映射器基于类类型等使用...它可能会变得丑陋而不是导致非常干的代码。他们的documentation对此并不十分清楚。

1 个答案:

答案 0 :(得分:1)

编辑1:

来自文档,

  

生成的实现使用普通的Java方法调用来在源对象和目标对象之间进行映射,即不涉及反射。默认情况下,如果属性在源和目标中具有相同的名称,则会对其进行映射,但是可以使用@Mapping和一些其他注释来控制这个和许多其他方面。

我怀疑这种映射器合同是否可行。 我们无法确定哪种类型会被实例化为此自动生成的结果。

有两种预期结果

  1. 生成类型为I 的类(我假设这是您期望的那样) - Currently not possible
  2. 生成一个类型为RealmObject的类,并且只映射基本方法属性和方法
  3. 如果您想要第二个结果,请按照this

    进行操作