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;
添加回答
举报