Kotlin的变量重名问题
问题背景
以下是一个简化的问题,可以思考一下,以下代码会出现什么问题
1 | interface Student { |
实际上,上面的代码在IDE中,并没有任何提示和报错信息,只有在编译的时候才会出现如下错误,
1 | Platform declaration clash: The following declarations have the same JVM signature (getName()Ljava/lang/String;): |
解惑
Kotlin与Java不同的之一,就是Kotlin会默认给变量添加get和set方法,默认的规则也是变量名前面直接添加get或set,如果我们在显示的写了一个方法名相同的函数,就有可能出现方法签名冲突,所以上面的情况就出现了方法名的冲突。
如果我们去掉显示写的getName(),可以看到生成的函数
1 | public final class Main { |
解决办法
既然我们定位到了问题的原因,那我们重新给自己的写的函数命名一下,是不是就可以了?这种方法是可以的,但是不够优雅,其实Kotlin给我提供了一下方法,去处理这种情况。
测试方法一:@JvmName 指定生成的函数名
@JvmName 注解是 Kotlin 提供的一个用于指定在编译为 Java 字节码时生成的 Java 类或方法名称的注解。它允许你在 Kotlin 代码中为特定的元素指定一个不同于默认生成的 Java 名称。
但是,在上面的代码中,你会遇到错误。
1 | This annotation is not applicable to target 'member property with delegate' |
因为我们用了Lazy代理,我们需要用 @get:JvmName(“name”) 来处理这种情况。