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

时间:2016-07-23 18:36:05

标签: function interface default kotlin

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

the error pictured in IDEA

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

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

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

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

p.s。我打算自己回答这个问题,但随时可以分享你自己的答案!

1 个答案:

答案 0 :(得分:4)

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

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

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

  'BaseThing'中的'Foo'是最终的,无法覆盖

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

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

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