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

如果您尝试在界面上创建内联函数,则会出现错误: 'inline' modifier is not allowed on virtual members. Only private or final members can be inlined 'inline' modifier is not allowed on virtual members. Only private or final members can be inlined

IDEA中的错误

我明白,这是因为该function是虚拟的,因为它可以被覆盖。

如果我们能够声明“关闭”function,这些function将不是虚拟的,因此可以内联,这是非常有用的!

使用“私人”给我们一个非虚拟的“封闭”function,但是世界其他地方却不能使用它!

所以..有没有办法为抽象types定义“封闭的”非虚拟可嵌入函数?

ps我打算自己回答这个问题,但可以自由分享你自己的答案!

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

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

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

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

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

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

但是由于可以在实现类中实现同名的方法,所以没有保护或“封闭”,并且优先。