猿问

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

我有一个接口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)

@ResponseBody

public 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>


我哪里错了?


鸿蒙传说
浏览 268回答 1
1回答

元芳怎么了

请注意,问题仍然是为什么您的内部方法使用接口,而公开公开的方法使用具体类。通常情况恰恰相反。如果可能的话,我建议将返回类型更改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;&nbsp; // 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) {&nbsp; &nbsp; if (idto instanceof FollowingResponseDto)&nbsp; &nbsp; &nbsp; &nbsp; followingResponseDtoList.add((FollowingResponseDto)idto);}return followingResponseDtoList;
随时随地看视频慕课网APP

相关分类

Java
我要回答