Java 不允许使用最终默认方法.. 但 Kotlin 允许吗?

Jir*_*ire 2 default interface function kotlin

如果您尝试在接口上创建内联函数,您将面临错误: 'inline' modifier is not allowed on virtual members. Only private or final members can be inlined

IDEA 中的错误

我知道这是因为该函数是虚拟的,因为它可以被覆盖。

如果我们能够声明“关闭”函数,这些函数就不会是虚拟的,因此能够被内联,这非常有用!

使用“private”为我们提供了一个非虚拟的、“封闭的”功能,但是世界其他地方无法使用它!

那么..有没有办法为抽象类型定义“封闭的”非虚拟内联函数?

ps 我打算自己回答这个问题,但请随意分享您自己的答案!

Jay*_*ard 5

你说“抽象类型”和抽象类你可以声明一个inline函数,它自动被认为是最终的。

abstract class BaseThing {
    inline fun foo() = "asdf"
}
Run Code Online (Sandbox Code Playgroud)

函数foo可以被调用,但不能在后代类中被覆盖。这导致错误:

“BaseThing”中的“Foo”是最终的,不能被覆盖

另一方面,接口不能有最终方法。但是您可以为几乎相同的接口编写扩展函数。

interface TraitThing { }
inline fun TraitThing.foo() = "asdf"
Run Code Online (Sandbox Code Playgroud)

但是没有保护或“封闭性”,因为您可以在实现类中实现同名方法,并且它会优先。