2
data class Bar(
  var foo: String = "",
  var isFoo: String = ""
)

编译器报告错误:

平台声明冲突:以下声明具有相同的 JVM 签名 (setFoo(Ljava/lang/String;)V): public final fun (<set-?>: String?): Unit defined in com.example.Bar public final fun (<set-?>: String?): com.example.Bar 中定义的单位

如何提示编译器为 setter 使用原始字段名称?(setFoo 和 setIsFoo) 注意:代码是由 jooq 生成的(来自数据库模式),所以手动更改代码不是一个好方法

4

2 回答 2

4

您需要使用以下命令注释 setter @JvmName

data class BarFoo(
    var foo: String = "",
    @set:JvmName("setIsFoo") var isFoo: String = ""
)

没有编译器错误,而是记录在案的行为(请参阅https://kotlinlang.org/docs/java-to-kotlin-interop.html#properties),要在不修改代码的情况下对其进行调整,您必须编写一些编译器插件。

也许有办法让jooq生成这样的代码?

于 2021-05-26T07:02:36.273 回答
2

这是 jOOQ 代码生成器中的一个错误,它应该@set:JvmName为这种情况生成注释,正如Михаил Нафталь所建议的那样。错误编号为#11912,已针对 3.15.0 和 3.14.12 修复。

KotlinGenerator.generatePojo()您可以通过覆盖该方法(需要复制整个代码并修补相关位)或使用 hack 来解决此问题:您可以覆盖该KotlinGenerator.printColumnJPAAnnotation()方法并在那里实现您的逻辑:

// Example implemented in Java:
@Override
protected void printColumnJPAAnnotation(JavaWriter out, ColumnDefinition column) {
    super.printColumnJPAAnnotation(out, column);

    String member = getStrategy().getJavaMemberName(column, Mode.POJO);
    if (member.startsWith("is") && ((ColumnDefinition) column)
            .getContainer()
            .getColumns()
            .stream()
            .anyMatch(c -> member.equals("is" + 
                StringUtils.toUC(getStrategy().getJavaMemberName(c, Mode.POJO))
            ))) {
        out.println("@set:JvmName(\"%s\")", 
            getStrategy().getJavaSetterName(column, Mode.POJO));
    }
}
于 2021-05-26T08:38:14.700 回答