【问题标题】:JOOQ Field class bounded to Record only (without type)JOOQ 字段类仅限于记录(无类型)
【发布时间】:2018-11-11 19:25:12
【问题描述】:

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

/**
 * 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 只接受它的类型作为泛型参数,而不接受记录类型。

在 JOOQ 代码库中是否有任何绑定到其 Record 类型的 Field 类的子/父?

谢谢。

【问题讨论】:

  • 注意你的接口签名是错误的。您不能使用 TableRecord 原始类型。你应该声明RB extends TableRecord&lt;RB&gt;

标签: java jooq


【解决方案1】:

在 JOOQ 代码库中是否有任何绑定到其 Record 类型的 Field 类的子/父?

TableField&lt;R extends Record, T&gt; 是您要查找的类型。任何其他可以提供对&lt;R&gt; 的引用的类型都将具有与您遇到的完全相同的问题,并且与TableField 相比,它不会提供任何语义优势

不管怎样,只是抑制警告:

@SuppressWarnings("unchecked")
Optional<EB> findById(PK id, TableField<RB, ?>... fields);

毕竟,使用可变参数时这些堆污染警告真的很烦人,而且更多的是语言的缺陷,而不是您的 API。

【讨论】:

  • 谢谢 Lukas,很有帮助。
猜你喜欢
  • 2013-11-12
  • 2017-04-04
  • 2018-05-20
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多