2

假设你有 2 个 Kotlin 类

class Battery(
    val carbon: Any,
    val zinc: Any
)
class RemoteControl(
    /* inline */ val battery: Battery,
    val buttons: Any
)

注意注释掉的inline关键字 in RemoteControl。取消注释它不会在 Intellij 中产生错误。

这是有效的 Kotlin 代码吗?它有什么作用?

我的期望是它相当于

class RemoteControl(
    val carbon: Any,
    val zinc: Any,
    val buttons: Any
)

但它似乎没有做任何事情。

我正在使用 Kotlin 1.3.72 和 Android Studio 4.0.1

4

1 回答 1

2

inline修饰符可以用在属性上(也可以用在主构造函数的属性上):

// var property
inline var battery: Battery
    get() = Battery("carbon", "zinc")
    set(v) {  }

// val property
inline val battery: Battery
    get() = Battery("carbon", "zinc")

// primary constructor
class RemoteControl(inline  val battery: Battery)

在这种情况下,所有访问器都会自动标记为内联。在调用站点,访问器作为普通函数内联

将 inline 应用于具有支持字段或其访问器的属性会导致编译时错误

// error: "Inline property cannot have backing field"
inline var battery: Battery
    get() = Battery("carbon", "zinc")
    set(v) { field = v } // we use backing field here

还有更多信息

于 2020-07-24T06:03:59.720 回答