Неоднозначный вызов метода не разрешен путем приведения - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь сделать что-то вроде:

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. Есть ли способ решить эту двусмысленность?

1 Ответ

0 голосов
/ 28 июня 2018

Это очень неудачное, но определенное поведение языка Java и различных компиляторов. В то время как предварительные генерики, метод, принимающий тип Select, будет более конкретным для вашего конкретного вызова, это уже не так, если задействованы обобщенные типы. Обоснование можно увидеть здесь .

Существует не так много универсальных и перегруженных API, как может сделать jOOQ, но вы можете, как пользователь. В таких случаях вы должны избегать привязки <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>, в случае которых перегрузки выиграли оба больше не применимы.

Я действительно рекомендую вам использовать генератор кода по этой причине (и для многих других) .

...