При реализации интерфейса в 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 (и, возможно, для обратной совместимости или по любой другой причине). .
- Невозможно встроить виртуальный метод. Inline просто означает «скопировать весь код в вызывающую программу», но для вызова абстрактного / интерфейсного метода реализация определяется во время выполнения на основе фактического класса задействованного объекта, поэтому невозможно определить, в какую реализацию копировать функция.
Однако, это не тот случай, когда вызывается финальная функция. В приведенном выше примере, когда я вызываю bar.qux()
, компилятор может гарантировать, что будет использоваться только эта конкретная реализация, и может безопасно встроиться. Не имеет значения, переопределяет ли он метод Foo.qux
- вызов foo.qux
будет использовать не встроенную версию, упомянутую в пункте 1, а вызов bar.qux
может безопасно встроить.
Это предупреждение существует только для того, чтобы разработчики знали об этом? Или есть побочные эффекты?