Java 仅绑定到记录的JOOQ字段类(无类型)

Java 仅绑定到记录的JOOQ字段类(无类型),java,jooq,Java,Jooq,我正在尝试创建一个泛型类型安全方法,以按主键从行中获取一些字段,如下所示: /** * Abstract Generic DAO Layer for BaseEntity * * RB - Record Bean * EB - Entity Bean * PK - Primary key type */ public interface AbstractDao<RB extends TableRecord, EB extends BaseEntity, PK> {

我正在尝试创建一个泛型类型安全方法,以按主键从行中获取一些字段,如下所示:

/**
 * Abstract Generic DAO Layer for BaseEntity
 *
 * RB - Record Bean
 * EB - Entity Bean
 * PK - Primary key type
*/
public interface AbstractDao<RB extends TableRecord, EB extends BaseEntity, PK> {

    /**
     * Fetches specified fields by given primary key
     */
    Optional<EB> findById(PK id, TableField<RB, ?>... fields);

}
/**
*BaseEntity的抽象泛型DAO层
*
*RB-记录Bean
*EB-实体Bean
*PK-主键类型
*/
公共接口抽象DAO{
/**
*按给定主键获取指定字段
*/
可选findById(主键id、表字段…字段);
}
虽然它工作正常,但问题是我不能在这里提供字段类型作为第二个泛型参数:

TableField<RB, ?>... fields
TableField。。。领域
因为我们只知道场本身,它导致了可能的结果

我很乐意将我的签名改为:

Optional<EB> findById(PK id, Field<RB>... fields);
可选findById(主键id、字段…字段);
但是
字段
只接受其类型作为泛型参数,而不接受记录类型

在JOOQ代码库中是否有字段类的子/父类绑定到其记录类型

谢谢

在JOOQ代码库中是否有字段类的子/父类绑定到其记录类型

TableField
是您要查找的类型。提供对
的引用的任何其他类型都会与您遇到的类型具有完全相同的问题,并且它不会比
TableField
提供任何语义优势

无论如何,只需抑制警告:

@SuppressWarnings("unchecked")
Optional<EB> findById(PK id, TableField<RB, ?>... fields);
@SuppressWarnings(“未选中”)
可选findById(主键id、表字段…字段);

毕竟,当使用varargs时,这些堆污染警告真的很烦人,更像是语言的缺陷,而不是API的缺陷。

请注意,您的接口签名是错误的。不能使用
TableRecord
raw类型。您应该声明
RB extends TableRecord
谢谢Lukas,这很有帮助。