我有以下类结构:
public interface CopyMapper<S, D> {
public D map(S sourceObject);
}
public interface CopyMapperFactory {
public <S, D> CopyMapper<S, D> getMapper(Class<S> sourceClass, Class<D> destinationClass);
}
public class Mapper {
public <S, D> D map(S source, Class<D> destinationClass) {
//This is where I get compile time error
CopyMapper<S, D> copyMapper = mapperFactory.getMapper(source.getClass(), destinationClass);
return copyMapper.map(source);
}
Run Code Online (Sandbox Code Playgroud)
我的Eclipse编译器给出了以下错误:
Type mismatch: cannot convert from CopyMapper<capture#1-of ? extends Object,D> to CopyMapper<S,D>
Run Code Online (Sandbox Code Playgroud)
据我所知,所有泛型类型都有扩展Object,所以我看不出问题出在哪里?
我们正在尝试保留一个界面.这是界面的原始方法:
<T> T map(Object source, Class<T> destinationClass)
Run Code Online (Sandbox Code Playgroud)
我稍微调整了一下,以便使用该接口的类不会受到影响:
<S, D> D map(S source, Class<D> destinationClass);
Run Code Online (Sandbox Code Playgroud)
基本上,我们正在映射Pojo,我们一直在使用DozerMapper,但现在,主要架构师希望编译时安全,而DozerMapper则不然.例如,如果pojo的字段被更新(重命名,删除),我们需要手动更新xml,它描述pojo之间的映射(xml用于非平凡映射的情况,例如,当pojo的字段名称时)不完全对应,通常是这种情况)
现在,我们有复制类,数百个,一个用于pojo之间的每个映射.我们正在尝试使用Factory Design模式CopyMapper根据源类和目标类返回特定的映射器类(实现接口).
该getClass方法返回Class<?>而不是Class<S>,正如我认为您所期望的那样。Object#getClass在 API 中查看。
当它返回时,Class<?>你会丢失类型信息,所以你真的有这个:
CopyMapper<?, D> copyMapper = mapperFactory.getMapper(source.getClass(), destinationClass);
Run Code Online (Sandbox Code Playgroud)
您知道源类是S这样,我认为您可以安全地添加演员表,但您会收到警告:
CopyMapper<S, D> copyMapper = mapperFactory.getMapper((Class<S>)source.getClass(), destinationClass);
Run Code Online (Sandbox Code Playgroud)