Java带泛型通配符的对象如何正确转换?Mock方法编译错误怎么解决?
问题原因
编译报错的核心是ResourceType.getWrapperClass()返回的是带多重通配符的泛型类型Class<? extends ResourceWrapper<? extends Resource>>,编译器无法自动将其与getResource方法的泛型参数绑定,无法验证AppleWrapper与返回类型的兼容性,因此thenReturn触发类型不匹配错误。
解决方案
方案1:使用doReturn语法(最推荐)
Mockito的doReturn API不做严格的编译时泛型校验,非常适配这种通配符泛型的Mock场景,无需类型转换也不会产生额外警告:
AppleWrapper appleWrapper = mock(AppleWrapper.class); doReturn(appleWrapper).when(client).getResource("test", resourceType.getWrapperClass());
方案2:强转Class类型(业务确定性高时可用)
你可以明确确认当前枚举项绑定的Class就是AppleWrapper.class,因此手动将通配符类型强转为具体类型,添加注解抑制unchecked警告即可:
AppleWrapper appleWrapper = mock(AppleWrapper.class); @SuppressWarnings("unchecked") Class<AppleWrapper> wrapperClazz = (Class<AppleWrapper>) resourceType.getWrapperClass(); when(client.getResource("test", wrapperClazz)).thenReturn(appleWrapper);
方案3:显式指定泛型参数
调用when时显式指定getResource的泛型返回类型,强制编译器做类型匹配,同样需要添加抑制警告的注解:
AppleWrapper appleWrapper = mock(AppleWrapper.class); @SuppressWarnings("unchecked") Mockito.<AppleWrapper>when(client.getResource("test", resourceType.getWrapperClass())) .thenReturn(appleWrapper);
内容的提问来源于stack exchange,提问作者shanfeng
相关产品推荐
相关产品推荐

