如何使重写单一表达式函数的返回类型为Unit?
如何重写一个返回void
或Unit
的函数,用一个表达式返回一些非Unit
类型的单表达式函数 ? 例如:
interface Base { fun overrideMe(): Unit } class Derived: Base { override fun overrideMe() = runAsync { } }
经过思考,我发现最好的方法是在顶层使用let
来覆盖单表达式函数来返回一个Unit
,然后根本不需要else子句 ,例如:
class Derived : Base { // v--- uses `let` here override fun overrideMe()=let{if (Math.random() < 0.5) runAsync { /*TODO*/ }} }
或者使用let in if表达式,例如:
class Derived : Base { // use let to return Unit explicitly , but I think T.let{Unit} is more clearly // and the Unit is optional you can do it as T.let{} simply ---v override fun overrideMe() = if (Math.random() < 0.5) runAsync { }.let { Unit } else Unit }
OR最后的声明如下:
class Derived : Base { // return Unit explicitly ---v override fun overrideMe() = if (Math.random() < 0.5){ runAsync { }; Unit } else Unit }
你可以使用kotlin-stdlib
中的一个函数来创建任何表达式的Unit
:
-
override fun foo() = someExpression.let { }
-
override fun foo() = Unit.apply { someExpression }
或者以任何方式编写你自己的扩展程序fun Any.toUnit(): Unit = ...
然后使用它。