我知道这种类型的擦除,并且在定义映射时会阻止使用泛型,因为这个问题指出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<?>
课程用法的任何示例。
答案 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。