KotlinのUnitについて

採用はこちら

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についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次