擦除错误,在具有相似签名的方法中使用泛型类型

Posted

技术标签:

【中文标题】擦除错误,在具有相似签名的方法中使用泛型类型【英文标题】:Erasure error, while using generic types in methods with similar signature 【发布时间】:2022-01-19 14:51:57 【问题描述】:

我想要以下:

用户 用户Dto 用户映射器

userDto = userMapper.map(user);
user = userMapper.map(userDto);

我的想法是有一个类似这样的类:

public interface EntityMapper<E, D> 
    E map(D dto);
    D map(E entity);

但我收到以下错误:

'map(D)' 与 'map(E)' 冲突;两种方法都有相同的擦除

如果没有要映射的 2 个函数,我如何实现这一点?

【问题讨论】:

【参考方案1】:

此代码可能会对您有所帮助:

import org.mapstruct.*;
import org.springframework.stereotype.Component; 

@Component
@Mapper(componentModel = "spring", builder = @Builder(disableBuilder = true))
public abstract class EntityMapper

    public abstract E map(D dto);
    public abstract D map(E entity);
 

【讨论】:

【参考方案2】:

问题在于map(D dto)map(E entity) 本质上具有相同的签名。是map(Object dto)map(Object entity)。当您调用entityMapper.map(something); 时,java 无法确定正在调用哪个方法 因此,您需要按如下方式定义您的方法:

public abstract class EntityMapper
   public abstract <E extends AbstractEntity, D extends AbstractDto> E map(D dto);
   public abstract <E extends AbstractEntity, D extends AbstractDto> D map(E entity);

【讨论】:

另外,我建议你看看 ModelMapper 库。这是一个非常整洁、智能和高效的库,可以为您完成繁重的工作。因此,您无需自己实现将不同对象相互转换的逻辑。【参考方案3】:

这也应该有效:

public interface EntityMapper<D extends AbstractDTO, E extends AbstractEntity> 
    E map(D dto);
    D map(E entity);

【讨论】:

以上是关于擦除错误,在具有相似签名的方法中使用泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 泛型擦除

java 16 -7 泛型方法和泛型接口(泛型类相似)

java学习笔记9.22(泛型)

关于Java泛型的类型擦除机制问题求教

理解Java泛型和类型擦除

Java语法糖之泛型与类型擦除