java - 通用类型不兼容

标签 java generics jooq

我在使用 JOOQ 的类上遇到泛型类型问题。

public abstract class BaseDataAccessObject<T extends BaseDataClass, U extends UpdatableRecord> {

    protected abstract RecordMapper<U, T> getRecordMapper();

    public T insert(T data) throws Exception{

        //Some code ...

        U record = getRecord(data);
        record.store();
        return record.map(getRecordMapper()); // <-- PROBLEM HERE !
    }
}

Map 接受此类型的一个参数 RecordMapper<Record, E>它返回 E 类型的对象.

我面临这个问题:

Error:(110, 22) java: method map in interface org.jooq.Record cannot be applied to given types;
required : org.jooq.RecordMapper<org.jooq.Record,E>
found : org.jooq.RecordMapper<U,T>
reason: cannot infer type-variable(s) E argument mismatch; org.jooq.RecordMapper<U,T> cannot be converted to org.jooq.RecordMapper<org.jooq.Record,E>)

我不明白为什么,因为:

  • 通用 U ,继承形式UpdatableRecord谁继承自 org.jooq.Record ,然后U应该与 org.jooq.Record 兼容.
  • E应该与 T 兼容(没有定义祖先)。

我必须保留 U延伸UpdatableRecord .

最佳答案

这个 Record.map(RecordMapper) 方法是 jOOQ 早期的一个错误。在非单子(monad)类型(即非包装类型)上使用 map 方法是完全没有意义的。例如。 Stream.map() 完全没问题,因为流可以将其内容映射到其他内容,从而生成另一个流。 Optional.map() 完全没问题,因为可选值可以将其内容映射到其他内容,从而生成另一个可选值。

但是项目/值不应该能够映射自身。通过使用递归泛型,有轻微的可能性来纠正这个问题,but that would have been an even bigger mistake .

但幸运的是,这是您问题的解决方案,而且非常简单:

    U record = getRecord(data);
    record.store();
    return getRecordMapper().map(record); // <-- PROBLEM HERE NO MORE !

关于java - 通用类型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40605878/

相关文章:

java - 如何使用 jooq 连接 3 个表并迭代结果?

java - 玩!框架 renderJson 未公开特定字段

java - 无法在 netbeans-8 上运行项目

java - 不兼容类型 : required T found T Android Studio

delphi - 如何搜索通用 TList<T> 集合?

sqlite - 无法使用JOOQ更新SQLITE中的表行

java - 文本流向 HTML

java - 如何使用 GCJ 创建 Java String 数组?

c# - 通过 IList 后门通用列表

java - jooq 中的列函数用于分割字符串