kotlin 字段 foo 和 isFoo 冲突:以下声明具有相同的 JVM 签名
kotlin field foo and isFoo clash: The following declarations have the same JVM signature
data class Bar(
var foo: String = "",
var isFoo: String = ""
)
编译器报告错误:
平台声明冲突:以下声明具有相同的 JVM 签名 (setFoo(Ljava/lang/String;)V):
public final fun (: String?): 单位定义在com.example.Bar
public final fun (: String?): 单位定义在com.example.Bar
如何提示编译器使用 setter 的原始字段名称? (setFoo 和 setIsFoo)
注意:代码是由jooq(从数据库模式)生成的,所以手动更改代码不是一个好方法
您需要用 @JvmName
注释 setter:
data class BarFoo(
var foo: String = "",
@set:JvmName("setIsFoo") var isFoo: String = ""
)
没有编译器错误,但有记录的行为(参见 https://kotlinlang.org/docs/java-to-kotlin-interop.html#properties),要在不修改代码的情况下进行调整,您必须编写一些编译器插件。
也许有办法让 jooq 生成这样的代码?
这是 jOOQ 代码生成器中的一个错误,它应该为这种情况生成 @set:JvmName
注释,正如 . The bug number is #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));
}
}
data class Bar(
var foo: String = "",
var isFoo: String = ""
)
编译器报告错误:
平台声明冲突:以下声明具有相同的 JVM 签名 (setFoo(Ljava/lang/String;)V):
public final fun (
如何提示编译器使用 setter 的原始字段名称? (setFoo 和 setIsFoo) 注意:代码是由jooq(从数据库模式)生成的,所以手动更改代码不是一个好方法
您需要用 @JvmName
注释 setter:
data class BarFoo(
var foo: String = "",
@set:JvmName("setIsFoo") var isFoo: String = ""
)
没有编译器错误,但有记录的行为(参见 https://kotlinlang.org/docs/java-to-kotlin-interop.html#properties),要在不修改代码的情况下进行调整,您必须编写一些编译器插件。
也许有办法让 jooq 生成这样的代码?
这是 jOOQ 代码生成器中的一个错误,它应该为这种情况生成 @set:JvmName
注释,正如
您可以通过覆盖 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));
}
}