通用类型不兼容

时间:2016-11-15 09:10:09

标签: 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

1 个答案:

答案 0 :(得分:1)

这种Record.map(RecordMapper)方法从早期的jOOQ开始就是错误的。在非monadic类型上,即在非包装类型上使用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 !