试图 return class 实现参数化接口的不兼容类型

Incompatible types trying to return class implementing parameterized interface

我已经定义了这个class:

public class ActorMapper implements RecordMapper<ActorRecord, ActorModel>

在别处,在具有此签名的函数中:

public <R extends Record, E> RecordMapper<R, E> 
    provide(RecordType<R> recordType, Class<? extends E> clazz)

我尝试 return new ActorMapper(),但 javac 抱怨:

incompatible types: com.steeplesoft.jooq.codegen.mapper.ActorMapper cannot be 
converted to org.jooq.RecordMapper<R,E>

我可以转换它并且工作正常,但为什么不能编译。有人可以帮我吗? :)

您提到的签名来自 RecordMapperProvider,这是一个通用 SPI,允许为 (RecordType<R>, Class<E>) 对提供自定义 RecordMapper<R, E> 实例。此方法上的泛型主要用于文档目的,这意味着对于您接收的任何输入类型,您都必须在输出映射器函数中支持。

无法以类型安全的方式捕获您在运行时收到的 实际 类型,因为您的 RecordMapperProvider 实现必须决定 每个输入对是否可以提供RecordMapper,如果不能提供returnnull,它可以return相同RecordMapper 对于多个输入对,如果 RecordMapper 有足够的能力。

因此,您将不得不进行不安全转换或使用原始类型。