繁体   English   中英

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

[英]How to create generic method which I used an instance of generic type T.class?

我有一个推土机映射可以将类转换为类并且我想要具有类型的通用方法,我可以使用实例调用它,例如 UserDto 到 User

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;

    }

}

不要在泛型类/方法中使用 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 编译器测试示例。 您也可以将其用作新测试的测试字段,这很简单,但 map 方法参数应与 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();
    }

}

它对我有用

公共类 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;

}

}

当我想使用它时,我需要继承类 public class SignUpServiceImpl extends ConvertToUsingDozerMapping

但就像那样,我可以为我所有班级的用户做到这一点

我需要将它用于同一类中的许多对象,例如: ConvertToUsingDozerMapping convertUserDtoToUser = new ConvertToUsingDozerMapping();

ConvertToUsingDozerMapping convertAddressDtoToAddress = new ConvertToUsingDozerMapping();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM