为了账号安全,请及时绑定邮箱和手机立即绑定

类型不匹配:无法从 List<capture#2-of 转换?将 IDto> 扩展为

类型不匹配:无法从 List<capture#2-of 转换?将 IDto> 扩展为

鸿蒙传说 2023-08-23 10:40:05
我有一个接口IDto和FollowingResponseDto实现IDto。我有一个在名为的类中看起来像这样的方法AbstractController:protected final List<? extends IDto> findPaginatedAndSortedInternal(page, size, sortBy, sortOrder, uriBuilder, response){    final Page<T> resultPage = getService().findAllPaginatedAndSortedRaw(page, size, sortBy, sortOrder);    if (page > resultPage.getTotalPages()) {        throw new ResourceNotFoundException();    }    return DtoEntityConverter.convertToResponseDtoList(Lists.newArrayList(resultPage.getContent()));}这是代码DtoEntityConverter.convertToResponseDtoList:public static List<? extends IDto> convertToResponseDtoList(List<? extends IEntity> entities) {    List<? extends IDto> dtoList = new ArrayList<>();    entities.forEach(e -> e.convertToResponseDto());    return dtoList;}最后,我有一个扩展类AbstractController:public class FollowingController extends AbstractReadOnlyController<Following> {    @Override@RequestMapping(method = RequestMethod.GET)@ResponseBodypublic List<FollowingResponseDto> findAllPaginatedAndSorted(        final int page,        final int size,        final String sortBy,         final String sortOrder,        final UriComponentsBuilder uriBuilder, final HttpServletResponse response) {        return findPaginatedAndSortedInternal(page, size, sortBy, sortOrder, uriBuilder, response);    }}return findPaginatedAndSortedInternal(page, size, sortBy, sortOrder, uriBuilder, response);FollowingController 中的调用给了我编译错误:Type mismatch: cannot convert from List<capture#2-of ? extends IDto> to List<FollowingResponseDto>我哪里错了?
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

请注意,问题仍然是为什么您的内部方法使用接口,而公开公开的方法使用具体类。通常情况恰恰相反。如果可能的话,我建议将返回类型更改findAllPaginatedAndSorted为List<? extends IDto>。


您不能从List<? extends IDto>to进行转换List<FollowingResponseDto>,因为前者可以包含实现的其他类型IDto,而不仅仅是FollowingResponseDto.


想象一下以下场景:


interface I {}

class A implements I {}

class B implements I {}


List<I> interfaceList = ...;

interfaceList.add(new A());

interfaceList.add(new B());

List<A> aList = interfaceList;  // error! interfaceList contains a B, and a B is not allowed in a list of As

现在您可能会争辩说您的场景中没有B,并且List<? extends IDto>仅包含 的实例FollowingResponseDto。但你的编译器不知道这一点,也不能保证这在未来的任何时候都不会改变。


要解决此问题,您需要自己进行转换。要么在中间做一个邪恶的转换List<?>,要么创建一个新的List<FollowingResponseDto>元素并单独添加每个元素List<? extends IDto>:


邪恶的:


return (List<FollowingResponseDto>)(List<?>)findPaginatedAndSortedInternal(...);

不邪恶:


var idtoList = findPaginatedAndSortedInternal(...);

var followingResponseDtoList = new ArrayList<FollowingResponseDto>();

for (var idto : idtoList) {

    if (idto instanceof FollowingResponseDto)

        followingResponseDtoList.add((FollowingResponseDto)idto);

}

return followingResponseDtoList;


查看完整回答
反对 回复 2023-08-23
  • 1 回答
  • 0 关注
  • 234 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信