泛型:无法转换为<capture#1-of?将Object,D>扩展为<S,D>

Dan*_*sev 8 java generics

我有以下类结构:

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根据源类和目标类返回特定的映射器类(实现接口).

Tob*_*ías 6

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)