如果你熟悉Java语言,那么你就会了解下面这个代码片段是不被允许的:
|
如果使用Kotlin编写,同样也是无法通过的:
|
但是,如果 SomeClass 这个类有一个属性是 data,那么情况就有点不一样:
|
上面这种写法是被允许的,因为当我们使用 SomeClass 的实例区分别访问属性和方法时,访问方式并不一样:
|
到这里,一切都合情合理。但如果我们看一下Kotlin反编译后的Java代码,会得到这样的结果:
|
这么看就有点奇怪了,因为出现了上面示例中不允许的代码。
什么原因呢?这个问题有三个点值得我们关注:
第一个很好理解,对Kotlin编译器来说,这两者并不存在签名冲突,所以是合法的。
2编译器的作用在于将文本代码编译成字节码,供JVM执行。”方法签名冲突“这个错误是编译器报告的错误,而不是JVM。
JVM在执行期间,对方法的调用是通过内存地址而不是方法签名,所以也就没有冲突的问题。
3Kotlin会被编译成JVM字节码,而不是Java代码。反编译得到的Java代码不一定能通过Java编译器的编译。
总结虽然Kotlin允许属性和getter方法同时存在,但是并不建议这样对属性和方法进行命名。首先命名上存在歧义;其次,如果在Java代码中调用这两个方法,Java编译器将会报错。因为Java编译器无法分data属性的getter方法和getData方法,导致无法通过编译。
看完原因再反过来看上面的问题,就会觉得这并不是个问题。但回想一下遇到这个问题时没有理解的原因,应该还是对Kotlin的理解出现了偏差。从Java转到Kotlin之后,很多时候还是会尝试从Java的角度来理解Kotlin,所以经常会忽略掉一个关键点:Kotlin基于JVM,而非Java。
以这个角度作为前提,才能更 “Writing Kotlin the Kotlin Way” 吧。
虽然经常从 stackoverflow.com 上找到问题的答案,但是从来没有提问或者回答过,遇到这个问题(最开始以为和继承有关系)搜索无果后,尝试在stackoverflow上提了个问题,结果很快就得到了回答。深切感受到了开发者的友善。”同一个世界,同一份代码“~ 感兴趣的同学可以去看下原答案。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved