KotlinにおけるUnitは、「意味のある値を返さない」ことを表す正式な型です。
Javaのvoidと似ていますが、設計思想と型システム上の扱いが根本的に異なります。
最初に結論を整理します。
UnitはKotlin標準ライブラリの正式な型(kotlin.Unit)Unitは唯一のインスタンス(Unit)を持つ- 通常の関数では
Unitは省略できる - JVM上では多くの場合
voidとして扱われる - ただし関数型・ジェネリクスでは「値」として扱われる
基本的な使い方
fun greet(): Unit {
println("Hello")
}
実際にはUnitは省略可能です。
fun greet() {
println("Hello")
}
この2つは完全に同じ意味になります。
なぜなら、戻り値を書かなかった場合、コンパイラが自動的にUnitと推論するからです。
Unitは本当に「値」を持つ
KotlinではUnitは単なる概念ではなく、実体を持つ型です。
val u: Unit = Unit
このコードは正しくコンパイルされます。
つまり
- 「何もない」のではなく
- 「情報を持たない値が1つ存在する」
という設計です。
これは関数型言語の思想に基づいています。
Javaのvoidとの違い
Javaのvoidは、戻り値が存在しないことを示す特別な指定です。
void greet() {
System.out.println("Hello");
}
Kotlinとの重要な違いは次の通りです。
Kotlin
Unitは正式な型- 値を1つ持つ
- ジェネリクスに使える
- 関数型で自然に扱える
Java
voidは通常の型とは扱いが異なる- 値として扱えない
- ジェネリクスに直接使えない(
Voidは存在するが実用性が低い)
※Javaにはjava.lang.Voidというクラスがありますが、インスタンスを持てないため、実質的に値を表現する用途では使いにくい設計です。
JVM上での実際の挙動
Kotlin/JVMでは次のようになります。
- Kotlinで
Unitを返す関数 - JVMバイトコード上では通常
voidとしてコンパイルされる - Javaから見ると
voidメソッドになる
つまり内部的には
- 言語レベルでは
Unit - JVMレベルでは多くの場合
void
という二層構造になっています。
ただし、関数型(FunctionN)やジェネリクスなど、値として保持する必要がある場面では、Unitのインスタンスが使用されます。
高階関数との関係
Unitが真価を発揮するのは関数型の文脈です。
fun execute(action: () -> Unit) {
action()
}
これは「何も返さない関数」を引数として受け取ります。
Javaでは同様のことをするにはRunnableなどのインターフェースが必要になりますが、Kotlinでは単純に関数型で表現できます。
これはUnitが正規の型だから可能です。
ラムダ式とUnit
val printer: (String) -> Unit = { message ->
println(message)
}
ラムダの最後の式がprintlnなので、自動的にUnitが返ります。
明示的にreturn Unitを書く必要はありません。
if式とUnit
Kotlinのifは式です。
val result = if (flag) {
println("True")
} else {
println("False")
}
このresultの型はUnitです。
理由
- 両分岐とも
println(戻り値はUnit) - 式の型は分岐の共通型
- よって
Unit
Nothingとの違い
混同しやすいのがNothingです。
fun fail(): Nothing {
throw Exception("Error")
}
違いは次の通りです。
| 型 | 意味 |
|---|---|
Unit | 正常に終了するが意味のある値はない |
Nothing | 正常終了しない(必ず例外などで終了) |
Nothingは「戻らない関数」の型です。
ジェネリクスでの扱い
Unitは型なので、ジェネリクスで自然に使えます。
val list: List<Unit> = listOf(Unit, Unit)
JavaでもList<Void>は書けますが、Voidには実質的な値が存在しないため扱いにくいという違いがあります。
実務での理解ポイント
通常のアプリ開発では
Unitを明示的に書くことは少ない- しかし関数型やコルーチンを使う場合は理解必須
特に次の場面で重要になります。
- 高階関数設計
- DSL設計
- Flow / Coroutine
- コールバック設計
- 非同期API設計
まとめ
Unitとは
「意味のある値を返さない」ことを型として表現するKotlinの設計
Javaのvoidと似ていますが、
- Kotlinでは型
- 値を持つ
- 関数型と完全に整合する
という点が本質的な違いです。
言い換えると、Kotlinは「何も返さない」という状態すら型システムの中に組み込んでいるという言語設計になっています。
以上、KotlinのUnitについてでした。
最後までお読みいただき、ありがとうございました。










