fetch返回不会转换为Record的记录类型

时间:2013-12-22 03:50:41

标签: java sql generics jooq

我在这里使用非常标准的语法,我想:

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

但它不会编译因为上面返回类型为

的记录对象
Result<Record4<T1, T2, ...>

这是一个自动生成的接口,它是Record的子接口,但编译器仍然不满意

我想通常java会将此视为隐式转换?似乎我不应该做任何明确的演员......

提示?谢谢

2 个答案:

答案 0 :(得分:1)

如果List<Banana>List<Fruit>,您可以将苹果添加到List<Banana>

List<Banana> bananaList = new ArrayList<>();
List<Fruit> fruitList = bananaList;
fruitList.add(new Apple());

因此它会打破泛型类型的类型安全性。

你可能想要

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

答案 1 :(得分:1)

不幸的是,Java不知道C#或Scala之类的声明站点差异:

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

// Scala style
trait Result[+Record] { ... }

以上两种情况都允许分配以下内容

Result<Record4<T1, ...>> r1 = ...
Result<Record> r2 = r1;

Result实际上定义为:

interface Result<R extends Record> {}

现在,由于您的查询表达式将<R>绑定到Record4<T1, ...>,这就是您要获得的内容:

Result<Record4<T1, ...>> r1 = selectDistinct(...).fetch();

或者,您可以使用通配符

Result<? extends Record> r2 = r1;

// Or shorter:
Result<?> r3 = r1;

另一种选择是在表达您的查询时强制删除类型安全:

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