通用类型不兼容
Generic type incompatibility
我在 class 使用 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>
并且它 return 是一个 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
,继承自 org.jooq.Record
的形式 UpdatableRecord
,那么 U
应该与 org.jooq.Record
兼容。
E
应与 T
兼容(未定义祖先)。
我必须保持 U
扩展 UpdatableRecord
。
这个 Record.map(RecordMapper)
方法是 jOOQ 早期的一个错误。在非单子类型(即非包装类型)上使用 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 !
我在 class 使用 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>
并且它 return 是一个 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
,继承自org.jooq.Record
的形式UpdatableRecord
,那么U
应该与org.jooq.Record
兼容。 E
应与T
兼容(未定义祖先)。
我必须保持 U
扩展 UpdatableRecord
。
这个 Record.map(RecordMapper)
方法是 jOOQ 早期的一个错误。在非单子类型(即非包装类型)上使用 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 !