【问题标题】:Ambiguous method call not resolved by casting模棱两可的方法调用未通过强制转换解决
【发布时间】:2018-06-27 19:57:49
【问题描述】:

我正在尝试做类似的事情:

t.set(field("ColumnName"), select(max(field("ColumnName"))).from("TableName"));

但我收到以下编译错误:

    Ambiguous method call, Both
    set(Field,Object)                    in InsertSetStep and
    set(Field,Select<? extends Record1>) in InsertSetStep match

我尝试通过强制转换解决歧义,但仍然收到相同的错误

Select<? extends Record1> sq = select(max(field("ColumnName"))).from("TableName");
t.set( field("ColumnName"), (Select<? extends Record1>)sq );

我有几个问题:

  1. 为什么强制转换不能解决这种情况下的歧义? (我已尝试转换为 (Object),这确实解决了歧义)
  2. 我有办法解决歧义吗?

【问题讨论】:

标签: java generics javac jooq overloading


【解决方案1】:

这是 Java 语言和各种编译器的一个非常不幸的但指定的行为。虽然是预泛型,但采用 Select 类型的方法对于您的特定调用将更具体,但一旦涉及泛型,情况就不再如此。 The rationale can be seen here.

没有太多像 jOOQ 这样的通用且重载的 API 可以做,但作为用户,您可以。在这种情况下,您必须避免将&lt;T&gt; 绑定到Object,要么使用代码生成器,要么手动传递数据类型:

// Assuming this is an INTEGER type
t.set(
    field("ColumnName", SQLDataType.INTEGER), 
    select(max(field("ColumnName", SQLDataType.INTEGER))).from("TableName"));

或者,您开始将列引用存储在一些静态变量中,例如:

Field<Integer> COLUMN_NAME = field("ColumnName", SQLDataType.INTEGER);

// And then:
t.set(COLUMN_NAME, select(max(COLUMN_NAME)).from("TableName"));

使用代码生成器

注意,当您使用代码生成器时,这几乎不是问题,在这种情况下,您将特定类型信息绑定到 Field&lt;T&gt; 引用的 &lt;T&gt; 类型,在这种情况下,重载获胜'两者都不再适用了。

I really recommend you use the code generator for this reason (and for many others).

【讨论】:

  • 感谢您的回复,非常有帮助。不幸的是,我认为使用代码生成器不适用于我当前的用例。我正在构建的库旨在允许用户动态创建表和更新列,因此这些表的架构并不稳定。我尝试了手动传递数据类型的建议,但我仍然遇到同样的模棱两可的方法错误:Field&lt;ULong&gt; columnName = field("ColumnName", SQLDataType.BIGINTUNSIGNED);t.set(columnName, select(max(columnName)).from("TableName"));
  • @jkchu:哦,我明白了,that 用例 :) 那么确实,没​​有为您生成代码......真的,还是同样的错误吗?使用什么 Java 版本/IDE 等?是否涉及任何原始类型(例如,t 的类型是否为原始类型)?
  • 啊,这就是问题所在! tInsertSetStep 的原始类型,更改它修复了模棱两可的方法错误。实际上,它解决了我原来的问题(甚至不需要手动传递数据类型)。感谢您的帮助以及您对 jOOQ 所做的所有出色工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多