繁体   English   中英

模棱两可的方法调用无法通过强制转换解决

[英]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 );

我有几个问题:

  1. 为什么在这种情况下投射无法解决歧义? (我尝试过强制转换为(Object) ,但这确实解决了歧义)
  2. 我有办法解决歧义吗?

这是非常不幸的,但是Java语言和各种编译器的指定行为。 当使用泛型时,采用Select类型的方法将针对您的特定调用更具体 ,一旦涉及泛型,则不再如此。 基本原理可以在这里看到

像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>类型的特定类型信息,在这种情况下,重载不会两者都不再适用。

因此,我真的建议您使用代码生成器(以及许多其他原因)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM