为什么 Intellij 项目和 Gradle 项目之间的 Kotlin 委托不同

问题描述 投票:0回答:1

我的Intellij版本是2024.2.4(内部版本#IU-242.23726.103,建于2024年10月23日)

我在以下位置创建了以下代码:

  • Intellij 项目:
    File
    >
    New
    >
    Project...
    >
    Kotlin
    • Build system
      :
      Intellij
      /
      OpenJdk 23
  • 在 Gradle 项目中:
    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;

为什么两个项目生成的字节码不同?

补充

补充1

kotlin 的版本都是 2.0.20 :

摇篮

plugins {
    kotlin("jvm") version "2.0.20"
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

...

Intellij 版本

我在构建日志中有版本

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]

补2

这在不同桌面上的 Ubuntu 版本的 Intellij 和 Windows 上重现(这出现在培训课程中)

补3

我把项目放在github里了。您可以使用 src/test1/Base2.kt

kotlin gradle intellij-idea kotlin-delegate
1个回答
0
投票

通过评论中的@sweeper查看,2024年Intellij版本使用的内置版本

kotlinc-jvm
是1.9.24,似乎对委托有不同的编译行为。

© www.soinside.com 2019 - 2024. All rights reserved.