我的Intellij版本是2024.2.4(内部版本#IU-242.23726.103,建于2024年10月23日)
我在以下位置创建了以下代码:
File
> New
> Project...
> Kotlin
Build system
: Intellij
/ OpenJdk 23
File
> New
> Project...
> Kotlin
Build system
: Gradle
/ OpenJdk 23
/ Kotlin
interface Base {
fun printMessage()
}
class BaseImpl(val x: Int) : Base {
override fun printMessage() { println(x) }
}
class BaseImpl2(val x: Int) : Base {
override fun printMessage() { println("2 $x") }
}
class Derived(var b: Base) : Base by b {
}
fun main() {
val base1 = BaseImpl(10)
val base2 = BaseImpl(12)
val derived = Derived(base1)
derived.printMessage()
derived.b = base2
derived.printMessage()
}
Intellij 项目执行输出:
10
12
Gradle 项目执行输出:
10
10
最后,我在 gradle 版本中体验了here的解释。
生成的字节码的差异就在那里:
public final class Editeur implements Base {
@NotNull
private Base b;
// $FF: synthetic field
private final Base $$delegate_0;
但是我们在 Intellij 中没有最终的委托 :
public final class Editeur implements Base {
@NotNull
private Base b;
为什么两个项目生成的字节码不同?
kotlin 的版本都是 2.0.20 :
plugins {
kotlin("jvm") version "2.0.20"
}
group = "org.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
...
我在构建日志中有版本
Executing pre-compile tasks…
Running 'before' tasks
Checking sources
Kotlin: connecting to daemon
Kotlin: compiling [untitled]
Kotlin: kotlinc-jvm 1.9.24-release-822 (JRE 23.0.1+11-39)
Kotlin: Language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features
Kotlin: performing incremental compilation analysis
Checking dependencies… [untitled]
Dependency analysis found 0 affected files
Updating dependency information… [untitled]
这在不同桌面上的 Ubuntu 版本的 Intellij 和 Windows 上重现(这出现在培训课程中)
我把项目放在github里了。您可以使用 src/test1/Base2.kt
通过评论中的@sweeper查看,2024年Intellij版本使用的内置版本
kotlinc-jvm
是1.9.24,似乎对委托有不同的编译行为。