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,这很有帮助。