科特林OVERRIDE_BY_INLINE

时间:2018-11-07 11:26:29

标签: oop kotlin inline

在Kotlin中使用inline函数实现接口时:

interface Foo {
    fun qux(fn: () -> Unit)
}

open class Bar : Foo {
    final override inline fun qux(fn: () -> Unit){TODO()}
}

IDE(可能还有编译器)抱怨此消息:

Override by an inline function

要禁止显示此消息,我必须使用@Suppress("OVERRIDE_BY_INLINE")批注。怎么了?

我已经知道的:

  • 对于普通的内联函数,kotlinc将内联该函数的所有用法内联,但仍将编译该函数的非内联版本,以便可以从Java调用它(并且可能是出于向后兼容性或其他原因) 。
  • 不可能内联虚拟方法。内联只是意味着“将所有代码复制到调用程序中”,但是对于调用抽象/接口方法,该实现是在运行时根据所涉及对象的实际类确定的,因此无法知道要复制到哪个实现中功能。

但是,调用最终函数时并非如此。在上面的示例中,当我调用bar.qux()时,编译器可以确保仅使用此特定实现,并且可以安全地内联。它是否覆盖Foo.qux方法无关紧要-调用foo.qux将使用第1点中提到的非内联版本,而调用bar.qux可以安全地内联。

该警告是否仅是为了确保开发人员意识到这一点?还是有副作用?

0 个答案:

没有答案