java - 模棱两可的方法调用未通过强制转换解决
问题描述
我正在尝试做类似的事情:
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
类型的方法将更具体地用于您的特定调用,但一旦涉及泛型,情况就不再如此。原理可以在这里看到。
像 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"));
使用代码生成器
请注意,当您使用代码生成器时,这几乎不是问题,在这种情况下,您将特定类型信息绑定到引用的<T>
类型Field<T>
,在这种情况下,重载将不再适用。
推荐阅读
- python - Python Polyglot:如何防止连字符分隔属于一起的单词
- java - 有没有一种简单的方法可以将包含秒和毫秒的时间戳值更改为具有小时和分钟的时间戳值?
- java - 带有来自 firebase rt dababase 的数据的 TextView 在屏幕上消失 - 第二个问题
- python - 为什么这个脚本在 Idle 中运行,而不是在 Jupyter Notebook 中运行?
- asp.net-core - .netcore webapi 调试暂停
- graphql - 如果 GraphQL 中的变量为空,我如何跳过查询?
- node.js - 如何修复返回空数组的猫鼬查询
- pandas - 如何将熊猫列中的数字拆分为十分位数?
- java - 如何使用 selenium webdriver 在同一选项卡中访问新打开的页面
- visual-studio - 当前不会命中断点。VS2017