gpt4 book ai didi

java - 类型不匹配 : cannot convert from List 扩展为 List

转载 作者:太空宇宙 更新时间:2023-11-04 09:22:54 24 4
gpt4 key购买 nike

我有一个界面IDtoFollowingResponseDto实现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>

我哪里出错了?

最佳答案

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

<小时/>

您无法从 List<? extends IDto> 进行转换至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;

关于java - 类型不匹配 : cannot convert from List<capture#2-of ? 将 IDto> 扩展为 List<FollowingResponseDto>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58090527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com