在Orika中定义映射时,实际上是否可以使用泛型?

时间:2016-02-17 14:56:41

标签: java orika

我知道这种类型的擦除,并且在定义映射时会阻止使用泛型,因为这个问题指出how to map generics objects with Orika?。但是Orika FAQ,在支持泛型部分声明:

  

是。 Orika包含通过特殊Type类映射泛型类型的特殊运行时支持,可用于定义模板类型的确切类型元素。

理想情况下,以下内容应该有效(假设我们可以通过某些Orika功能以某种方式在运行时维护类参数):

     mapperFactory.classMap(Asset<T,K>.class, AssetDto<K>.class)
    .maybeSomeCustomization...
    .byDefault()
    .register();

我无法找到有关Orika常见问题提及的Type<?>课程用法的任何示例。

2 个答案:

答案 0 :(得分:5)

有可能,您需要使用MapperFactory#classMap(Type<A>, Type<B>) API而不是MapperFactory#classMap(Class<A>, Class<B>)

您可以在generics包中的Orika测试中找到很多示例。

要构建Type实例,您可以使用TypeBuilder的就地匿名子类:

Type<MyGenericClass<GenericParam1, GenericParam2>> type =
    new TypeBuilder<MyGenericClass<GenericParam1, GenericParam2>>() {}.build();

注意创建匿名子类的构造函数后面的括号{}。这样,Orika可以使用MyGenericClass<GenericParam1, GenericParam2>找出实际的((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()类型参数。

答案 1 :(得分:0)

您可以使用TypeBuilder API来保留通用类型信息,以便Orika在执行映射时可以使用它。

请注意,Java不允许我们在Class文字中指定type参数。例如,我们不能写Asset<Book>.class。此外,由于类型擦除,我们无法在运行时访问实际的类型参数。简而言之,原始类型(即Asset.class)没有向Orika提供足够的信息。

因此,首先,我们必须使用TypeBuilder创建通用类型:

Type<Asset<Person>> sourceType = new TypeBuilder<Asset<Person>>() {}.build();
Type<AssetDto<Person>> targetType = new TypeBuilder<AssetDto<Person>>(){}.build();

然后在classMap调用中,我们必须使用以下类型:

factory.classMap(sourceType, targetType).byDefault().register();

最后,我们可以使用以下类型执行映射:

factory.getMapperFacade().map(asset, sourceType, targetType);

阅读以下帖子,以详细了解generics usage with Orika