试图 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
有足够的能力。
因此,您将不得不进行不安全转换或使用原始类型。
我已经定义了这个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
有足够的能力。
因此,您将不得不进行不安全转换或使用原始类型。