Java fetch返回不会强制转换到记录的记录类型

Java fetch返回不会强制转换到记录的记录类型,java,sql,generics,jooq,Java,Sql,Generics,Jooq,我在这里使用了相当标准的语法,我认为: Result<Record> = [DSLContext].selectDistinct(...).fetch(); Result=[DSLContext].selectDistinct(…).fetch(); 但它不会编译,因为上面返回的是类型为的记录对象 Result<Record4<T1, T2, ...> 结果如果列表是列表,您可以将苹果添加到列表: List bananaList=new ArrayList()

我在这里使用了相当标准的语法,我认为:

Result<Record> = [DSLContext].selectDistinct(...).fetch();
Result=[DSLContext].selectDistinct(…).fetch();
但它不会编译,因为上面返回的是类型为的记录对象

Result<Record4<T1, T2, ...>
结果如果
列表
列表
,您可以将苹果添加到
列表

List bananaList=new ArrayList();
列表结果列表=bananaList;
添加(新苹果());
因此,它将破坏泛型类型的类型安全性

你可能想要

Result<? extends Record> result = [DSLContext].selectDistinct(...).fetch();

Result不幸的是,Java不知道声明站点的变化,比如C#或Scala:

// C# style
interface Result<out Record> { ... }

// Scala style
trait Result[+Record] { ... }
现在,由于查询表达式将
绑定到
Record4
,您将得到以下结果:

Result<Record4<T1, ...>> r1 = selectDistinct(...).fetch();
Result r1=selectDistinct(…).fetch();
或者,您可以使用通配符

Result<? extends Record> r2 = r1;

// Or shorter:
Result<?> r3 = r1;
结果r3=r1;
另一个选项是在表达查询时强制删除typesafety:

Result<Record> r4 = selectDistinct(new Field[] { ... }).fetch();
Result r4=selectDistinct(新字段[]{…}).fetch();

您甚至可以方便地编写
结果
,因为
有一个声明站点上限,即
记录
@touldinglobsibility:哪一部分帮助最大?:-)嗨,卢卡斯-我真正需要的是一个关于泛型、通配符等的迷你教程——我得到了!jooq很酷,谢谢你的辛勤工作
Result<Record4<T1, ...>> r1 = selectDistinct(...).fetch();
Result<? extends Record> r2 = r1;

// Or shorter:
Result<?> r3 = r1;
Result<Record> r4 = selectDistinct(new Field[] { ... }).fetch();