模棱两可的方法调用未通过转换解决
Ambiguous method call not resolved by casting
我正在尝试做类似的事情:
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 );
我有几个问题:
- 为什么转换不能解决这种情况下的歧义? (我尝试转换为
(Object)
并且确实解决了歧义)
- 有什么方法可以解决我的歧义吗?
这是一个非常不幸的行为,但是 Java 语言和各种编译器的特定行为。虽然前泛型,采用 Select
类型的方法对于您的特定调用将 更具体 ,但一旦涉及泛型,就不再如此。 The rationale can be seen here.
像 jOOQ 一样,没有太多通用和重载的 API,但作为用户,您可以。在这种情况下,您必须避免将 <T>
绑定到 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<T>
引用的 <T>
类型,在重载不再适用的情况。
.
我正在尝试做类似的事情:
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 );
我有几个问题:
- 为什么转换不能解决这种情况下的歧义? (我尝试转换为
(Object)
并且确实解决了歧义) - 有什么方法可以解决我的歧义吗?
这是一个非常不幸的行为,但是 Java 语言和各种编译器的特定行为。虽然前泛型,采用 Select
类型的方法对于您的特定调用将 更具体 ,但一旦涉及泛型,就不再如此。 The rationale can be seen here.
像 jOOQ 一样,没有太多通用和重载的 API,但作为用户,您可以。在这种情况下,您必须避免将 <T>
绑定到 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<T>
引用的 <T>
类型,在重载不再适用的情况。