亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

類型不匹配:無法從 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 關注
  • 336 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號