擦除错误,在具有相似签名的方法中使用泛型类型
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);
【讨论】:
以上是关于擦除错误,在具有相似签名的方法中使用泛型类型的主要内容,如果未能解决你的问题,请参考以下文章