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();