Kotlin 中从字符串到列表的 jOOQ 转换器<MyType>

问题描述 投票:0回答:1
我正在研究一种罕见的情况,我发现将 JSON 存储在 RDBMS 字段中是可以接受的。 JSON 文档是一个数组或键值对象。

因此,

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

 不变量是可疑的。

generics kotlin jooq
1个回答
0
投票
所以这并不是您正在寻找的解决方案,但它是一种解决方法:

如果您将类型

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,但这可能需要在代码库中进行一些更大的重构和测试,所以我可以理解不想这样做。

© www.soinside.com 2019 - 2024. All rights reserved.