我正在尝试创建一个通用的类型安全方法,以便按主键从行中获取一些字段,如下所示:
/**
* 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);
}
虽然它工作正常,但问题是我不能在这里提供字段类型作为第二个通用参数:
TableField<RB, ?>... fields
因为众所周知它只是自己的字段,它导致heap pollution issue。
我很乐意将签名改为:
Optional<EB> findById(PK id, Field<RB>... fields);
但是Field
只接受其类型作为通用参数,而不是记录类型。
是否有任何Field类的子/父与JOOQ代码库中的Record类型绑定?
感谢。
答案 0 :(得分:1)
是否有任何Field类的子/父与JOOQ代码库中的Record类型绑定?
TableField<R extends Record, T>
是您正在寻找的类型。提供<R>
引用的任何其他类型都会遇到与您遇到的问题完全相同的问题,并且它不会提供超过TableField
的任何语义优势
无论如何,只要取消警告:
@SuppressWarnings("unchecked")
Optional<EB> findById(PK id, TableField<RB, ?>... fields);
毕竟,使用varargs时这些堆污染警告真的很烦人,而且比你的API更具有语言缺陷。