使用带界泛型创建接口实现类对象时遇类型不匹配错误求助
泛型类型不匹配问题原因及解决
我尝试使用带界泛型创建实现ScannableEntity接口的Attachment子类的泛型对象,但初始化时遇到类型不匹配错误。
接口定义
public interface ScannableEntity { }
实现类
public final class Attachment implements ScannableEntity { // 类实现代码 }
带界泛型类定义
@Builder public class SegmentPageScanResult<TEntity extends ScannableEntity> { // 类成员及方法 }
public class ItemProcessor<TEntity extends ScannableEntity> { void submitAndExecute(SegmentPageScanResult<TEntity> pageScanResult) { // 方法实现 } }
单元测试代码
@ExtendWith(MockitoExtension.class) public class ScanTest { @Mock private ItemProcessor<Attachment> itemProcessor; @Test public void testDoScan() { Attachment mockRecord = new Attachment(); SegmentPageScanResult<Attachment> segmentPageScanResult = SegmentPageScanResult.builder() .scannedItems(ImmutableList.of(mockRecord)) .isLastPage(true) .build(); verify(itemProcessor).submitAndExecute(segmentPageScanResult); } }
错误信息
Required type: SegmentPageScanResult<Attachment> Provided:SegmentPageScanResult<ScannableEntity>
问题原因
核心问题出在Lombok的@Builder注解上:当调用SegmentPageScanResult.builder()时,编译器无法自动推断出目标泛型类型是Attachment,会默认使用泛型的上界ScannableEntity来创建builder实例,最终build出的对象类型为SegmentPageScanResult<ScannableEntity>。
Java泛型属于静态类型检查,SegmentPageScanResult<Attachment>和SegmentPageScanResult<ScannableEntity>是不同的参数化类型——即便Attachment实现了ScannableEntity,两者也不能直接赋值(泛型默认是不可变的,除非使用通配符? extends ScannableEntity,但此处方法参数要求精确匹配类型)。
解决方法
有两种简单的修复方式:
- 显式指定泛型类型:调用builder时明确声明泛型参数,让编译器确定目标类型:
SegmentPageScanResult<Attachment> segmentPageScanResult = SegmentPageScanResult.<Attachment>builder() .scannedItems(ImmutableList.of(mockRecord)) .isLastPage(true) .build();
- 借助参数辅助类型推断:如果
SegmentPageScanResult存在接收TEntity类型的属性或方法,可先设置该属性,让编译器通过参数类型自动推断泛型(该方式依赖类结构,显式指定更直接可靠)。
内容的提问来源于stack exchange,提问作者Megha Agarwal
相关产品推荐
相关产品推荐

