101010

プログラミング備忘録とともに、ポエムってます。

Nothing型はコンパイラに、関数が決して正常に完了しないことを保証する | Android Kotlin

f:id:araemonz:20190225162559p:plain

Kotlinプログラミング を読んで、いままで謎だったNothing型のことをようやく理解できたのでメモしておく。

Kotlinでは関数において何も返さない場合にはUnit型を使う。そのUnit型と似たものにNothing型というのがある。Nothing型も何も返さないという意味なのだが、実はUnit型とはちょっと違った。

コンパイラに、関数が決して正常に完了しないことを保証するのだ。

実際にNothing型を使っているプログラムを見てみよう。自動で実装されるときに良く見かけるTODO関数だが、実はこの関数はNothing型を返している。

/**
 * Always throws [NotImplementedError] stating that operation is not implemented.
 *
 * @param reason a string explaining why the implementation is missing.
 */
@kotlin.internal.InlineOnly
public inline fun TODO(reason: String): Nothing = throw NotImplementedError("An operation is not implemented: $reason")

例えば次のような形でTODO関数は実装されるだろう。

fun doSomething():String {
    TODO("Stringを返すように実装しなければならないが、とりあえず後回しにする。")
}

本来ならばこのdoSomething関数はString型を返さないとコンパイルエラーになるところだ。しかし、TODO関数が返すNothing型によってこのような記述でもコンパイルが通るのである。

最初に述べたとおりNothing型はコンパイラに、関数が決して正常に完了しないことを保証するのだ。Nothing型によって関数が決して正常に完了しないことが保証されているわけなので、コンパイラは戻り値の型をチェックする必要がないということだ。だからこのような記述ができるということであった。

参考