无法再设置 "annonymous" 个记录字段

Can no longer set "annonymous" record fields

在更新 Java 和 JOOQ 之后,一个以前工作的函数似乎 运行 变成了类型转换错误,特别是行记录。set/with(或设置列的任何版本) ...

public void set_col_value(String col, String val, int options) {
        final boolean optional = (options & Optional_Value) != 0;
        if (val == null) {
            if (optional) {
                return;
            }
            throw new RuntimeException("missing value: " + val);
        }
        final boolean as_bool = (options & As_Boolean) != 0;
        if (as_bool) {
            if (val.equals("true")) {
                record.set(table.field(col), true);
            } else if (val.equals("false")) {
                record.with(table.field(col), false);
            } else {
                throw new RuntimeException("bad boolean value: " + val);
            }
        } else {
            record.with(table.field(col), val);
        }
    }

他们给出了这个错误

    error: no suitable method found for set(Field<CAP#1>,boolean)
                    record.set(table.field(col), true);
    method Record.<T#1>set(Field<T#1>,T#1) is not applicable
      (inference variable T#1 has incompatible bounds
        equality constraints: CAP#2
        lower bounds: Boolean)
    method Record.<T#2,U>set(Field<T#2>,U,Converter<? extends T#2,? super U>) is not applicable
      (cannot infer type-variable(s) T#2,U
        (actual and formal argument lists differ in length))
  where T#1,T#2,U are type-variables:
    T#1 extends Object declared in method <T#1>set(Field<T#1>,T#1)
    T#2 extends Object declared in method <T#2,U>set(Field<T#2>,U,Converter<? extends T#2,? super U>)U extends Object declared in method <T#2,U>set(Field<T#2>,U,Converter<? extends T#2,? super U>)
  where CAP#1,CAP#2 are fresh type-variables:
    CAP#1 extends Object from capture of ?
    CAP#2 extends Object from capture of ?

为了回答为什么事情过去有效而不再有效,我需要更多信息(请参阅评论)。您可能还更改了一些其他内容,包括删除了一些原始类型转换等。

但它们不应该起作用。查看 Record.set(Field<T>, T) and Fields.field(String) 方法。后者 returns Field<?> 带有通配符。您不能只将 Field<?>boolean 传递给 Record::set 方法,T 类型必须匹配。

以下是该特定调用的可能解决方法:

// Using raw types
record.set((Field) table.field(col), true);

// Using unsafe casts
record.set((Field<Boolean>) table.field(col), true);

我不记得哪个 jOOQ 版本没有要求...