在Kotlin中安全地将jOOQ的TableField〈*,*>强制转换为TableField〈*,{某个对象类型}>

yks3o0rb  于 2022-12-23  发布在  Kotlin
关注(0)|答案(1)|浏览(67)

我在Kotlin里有这样一个函数

fun getJooqOperator(field: TableField<*,*>, value: String): org.jooq.Condition {
  // In this case, "this" is the operator enum. 
  // The combination of field and operator is strictly handled in the front-end (Elm)
  return when (this) {
    EQ -> (field as TableField<*, String>).eq(value)
    NEQ -> (field as TableField<*, String>).ne(value)
    GT -> (field as TableField<*, Int>).gt(Integer.parseInt(value))
  }
}

这一部分用在Kotlin类中,该类将从前端反序列化一些JSON。从这个JSON,该类将基于用户的输入构建一个jOOQ-query。这一部分是关于使用正确的运算符和相应的列和输入值。
然而这不会导致编译错误,IntelliJ抱怨field的强制转换。我确信这些字段可以安全地强制转换为特定的操作符枚举。这是IntelliJ抛出的警告:

我不想使用Change type arguments to <*, *>,因为如果不进行强制转换,jOOQ条件将无法处理这些值。
有没有办法重写我的函数,或者我可以安全地忽略这些警告?

vuktfyat

vuktfyat1#

铸造

[...]还是可以安全地忽略这些警告?
我不确定你在这里期望什么样的安全性。你的假设EQNEQ是基于String的,而GT是基于Int的,这是相当强的。你可能有你的原因。如果你这样编码,并且知道为什么,那么是的,你可以安全地忽略这些警告。这并不意味着这样的类型转换是“安全的”* 一般来说 *,它们不是。*可以转换为任何 * 未知 * 类型,但是在你的类型转换中,你做了一个有效的假设,该类型应该是已知的,只是不可能在类型系统中表达它。

胁迫

You can always use data type coercion as well,例如

return when (this) {
    EQ -> field.coerce(SQLDataType.VARCHAR).eq(value)
    NEQ -> field.coerce(SQLDataType.VARCHAR).ne(value)
    GT -> field.coerce(SQLDataType.INTEGER).gt(Integer.parseInt(value))
}

不过,与不安全的强制类型转换不同,这确实会对您正在构建的表达式树产生影响。在您的情况下,可能不是一个重要的影响。

相关问题