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

Java doesn't allow final default methods.. but does Kotlin?

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

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

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

使用 "private" 为我们提供了一个非虚拟的 "closed" 功能,但世界其他地方无法使用它!

那么..有没有办法为抽象类型定义 "closed" 非虚内联函数?

(p.s。我打算自己回答这个问题,但请随时分享您自己的答案!)

你说 "abstract types" 和抽象 class 你可以声明一个 inline 函数,它会自动被认为是最终的。

abstract class BaseThing {
    inline fun foo() = "asdf"
}

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

'Foo' in 'BaseThing' is final and cannot be overridden

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

interface TraitThing { }
inline fun TraitThing.foo() = "asdf"

但是没有保护或者"closedness"因为你可以在实现class中实现同名方法,它会优先