Java的泛型是通过类型擦除来实现的,这意味着在编译期间泛型类型信息会被擦除掉。例如,对于泛型类List<T>
,在编译时会被转换为List<Object>
,并且在运行时,List对象中的元素类型信息也会被擦除。因此,在运行时,不能确定List中存储的具体类型是什么。
这种类型擦除可能导致一些问题。例如,如果在泛型方法中尝试使用T的类型信息,那么在运行时,该类型信息将不再可用。此外,如果尝试使用反射获取泛型类型的信息,也可能会遇到类似的问题。
-
遇到的坑:
Mockito (Spock没有这个问题) Mock方法
PortalRepayPlanResponseV1 buildPortalRepayPlanResponseV1(List<PortalRepayPlanDTO> repayPlanList, List<AmountInfoDTO> amountInfoList)
❌ Mock无效:Mockito.doReturn(new EasyRandom().nextObject(PortalRepayPlanResponseV1.class)).when(portalDebtService).buildPortalRepayPlanResponseV1(_ as List<
PortalRepayPlanDTO
>, _ as List<AmountInfoDTO
>)✅:Mockito.doReturn(new EasyRandom().nextObject(PortalRepayPlanResponseV1.class)).when(portalDebtService).buildPortalRepayPlanResponseV1(
ArgumentMatchers.anyList()
,ArgumentMatchers.anyList()
)