我在这里使用非常标准的语法,我想:
Result<Record> = [DSLContext].selectDistinct(...).fetch();
但它不会编译因为上面返回类型为
的记录对象Result<Record4<T1, T2, ...>
这是一个自动生成的接口,它是Record的子接口,但编译器仍然不满意
我想通常java会将此视为隐式转换?似乎我不应该做任何明确的演员......
提示?谢谢
答案 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();