因此,
jOOQ 转换器 从 String
转换为
List<MyType>
。我在 Kotlin 中执行此操作,这就是乐趣的开始 - 使用泛型。
转换器
@Suppress("UNCHECKED_CAST")
class MyTypeListConverter :
AbstractConverter<String, List<MyType>>(String::class.java, List::class.java as Class<List<MyType>>) {...}
发电机配置
database {
inputSchema = "PUBLIC"
includes = ".*"
recordVersionFields = "(version|VERSION)"
customTypes {
customType {
name = "MyTypeListConverter"
type = "java.util.List<mypackage.MyType>"
converter = "mypackage.MyTypeListConverter"
}
}
forcedTypes {
forcedType {
name = "MyTypeListConverter"
expression = ".*Event\\.MYFIELD"
types = ".*"
converter = "mypackage.MyTypeListConverter"
}
}
}
生成的jOOQ代码
public final TableField<EventRecord, List<MyType>> MYFIELD =
createField("TITLE", org.jooq.impl.SQLDataType.CLOB.nullable(false), this, "", new MyTypeListConverter());
问题
由于类型不兼容,生成的 jOOQ 代码无法编译。List<MyType>
声明的
MYFIELD
与从
List<? extends MyType>
方法推断出的
createField()
不兼容。最终这可能更多的是关于 Java-Kotlin 泛型互操作性而不是 jOOQ。错误消息中的
? extends MyType
不变量是可疑的。
如果您将类型
java.util.List<mypackage.MyType>
替换为 java 数组
mypackage.MyType[]
并使您的转换器转换为 kotlin 数组
@Suppress("UNCHECKED_CAST")
class MyTypeListConverter :
AbstractConverter<String, Array<MyType>>(String::class.java, Array::class.java as Class<Array<MyType>>) {...}
您可以获得足够接近您想要的东西,只需将该数组转换为代码其他部分中的列表,它并不完全理想,但总比没有好。另一个选项可能是将 jooqs 代码生成输出设置为 kotlin,但这可能需要在代码库中进行一些更大的重构和测试,所以我可以理解不想这样做。