如何创建我使用泛型类型T.class的实例的泛型方法



我有一个推土机映射可以将类转换为类,我想有一个类型为的通用方法,我可以用实例调用它例如用户Dto到用户

User user = ConvertToUsingDozerMapping.convertToUsingDozerMapping(userDto)
for example AddressDto to Address
User user = ConvertToUsingDozerMapping.convertToUsingDozerMapping(addressDto)
public class ConvertToUsingDozerMapping<I,O> {
@Autowired
private DozerBeanMapperFactoryBean dozerBean;
public I convertToUsingDozerMapping(O o)  {
Mapper mapper = null;
mapper = (Mapper) dozerBean.getObject();
I i=  mapper.map(o, I.class);// doesn't compile
return i;
}
}

它像一样对我有效

公共类ConvertToUsingDozerMapping{

@Autowired
private DozerBeanMapperFactoryBean dozerBean;   
public I convertToUsingDozerMapping(O o, Class<? extends I> clazz) throws Exception  {
Mapper mapper = null;
mapper = (Mapper) dozerBean.getObject();
I i=    mapper.map(o, clazz);
return i;
}

}

当我想使用它时,我需要继承类公共类SignUpServiceImpl扩展ConvertToUsingDozerMapping

但就像那样,我可以在我所有的类中为用户做这件事

我需要将它用于同一类中的许多对象就像这样:ConvertToUsingDozerMappingconvertUserDtoUser=新的ConvertToUsing DozerMapping((;

ConvertToUsingDozerMappingconvertAddressDtoAddress=新的ConvertToUsing DozerMapping((;

但当我这样做时,它不起作用,我在Mapper上有异常nullpointerException,我不知道为什么?

不要在泛型类/方法中使用T.class。相反,将参数提取到不使用泛型的调用程序中,添加一个Class clazz参数。


关于创建通用方法,请使用以下方案:

public <I, O> I convertToUsingDozerMapping(O o)  {
...
}

编辑

最初的问题是回答更多关于如何制作通用方法的问题。我没有关注mapper.map问题。

事实上,我看到了T.class,并直接假设问题是用mapper.map转换为类型I,这就是我添加I.class的原因,但正如评论中所提到的,这是不起作用的。

现在,关注T.class问题:

我会通过将T.class或I.class问题排除在泛型方法之外和/或在必要时甚至排除在泛型类之外来解决这个问题,方法是创建一个新的clazz参数,使用相同类型的mapper.map,从中可以手动使用/指定要使用的类型(查看底部示例(。之后,您可以直接将clazz参数传递给mapper.map,而不需要.class,也不会出现任何问题。

如果它对你有效,请检查它(可以使用第三种T类型,或者删除它并只使用I/O(:

public <I, O, T> I convertToUsingDozerMapping(O o, Class<? extends T> clazz)  {
...
I i = mapper.map(o, clazz);
...
}

我还添加了一个通用的基本java编译器测试示例。您也可以将其用作新测试的测试字段,这很简单,但映射方法参数的类型应该与mapper.map:相同

class TestG {
public static <I, O, T> I map(O o, Class<? extends T> clazz) {
System.out.println("map dummy implementation");
return null; // this is only a check function, no implementation done
}
public <I, O, T> I convertToUsingDozerMapping(O o, Class<? extends T> clazz) {
I i = map(o, clazz);
return i;
}
public void testme() {
System.out.println("----- CONVERT TEST/ -----");
String s = "";
Integer i = 1;
String r = convertToUsingDozerMapping(i, String.class);
System.out.println("----- /CONVERT TEST -----");
}
public static void main(String[] args) {
TestG t = new TestG();
t.testme();
}
}

最新更新