0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kotlin】Kotlin の `Void` 型とは

Last updated at Posted at 2025-10-13

はじめに

Kotlin の Void は、Java の void に対応するラッパ型(クラス) です。
Kotlin ネイティブではほとんど使いませんが、 Java との相互運用(Interop) のために存在します。


1. 定義と役割

Void は Kotlin 標準型ではなく、
java.lang.Void クラスとして Java 側に定義されています。

public final class Void {
    private Void() { } // インスタンス化不可
}

つまり:

  • Kotlin の Void = java.lang.Void
  • 実際には値を持たない
  • コンストラクタも private(作れない)

2. どんなときに登場する?

Kotlin のコード内ではめったに使いません。
主に以下のようなJava連携のときに自動で現れます。

例:Java の Callable<Void> を Kotlin で使う

// Java 側
Callable<Void> task = () -> {
    System.out.println("Hello from Java");
    return null;
};

これを Kotlin で扱うと:

val task = Callable<Void> {
    println("Hello from Kotlin")
    null  // Void 型には null を返す必要あり
}

Void 型には 実際の値が存在しないため、
return null しかできません。


3. Unit との違い

Kotlin では普通、「値を返さない関数」は Unit を使いますが、
Java の void を扱うときだけ Void に変換されます。

比較項目 KotlinのUnit JavaのVoid
所属 Kotlin 標準型 Java ライブラリ型
値の存在 Unit(1つの実体あり) ❌ インスタンス化不可
null許容 Unit? 可能 Void は常に null 扱い
用途 Kotlin 関数戻り値 Javaの Callable<Void>, Future<Void> など
表現 fun f(): Unit fun f(): Void + return null

4. Java の void ↔ Kotlin の型マッピング

Java 側 Kotlin 側 補足
void Unit 通常の関数戻り値
Void Void!(プラットフォーム型) Interop 時のみ登場

つまり:

  • Java メソッドの戻り値が void → Kotlin では Unit に変換される
  • Java メソッドの戻り値が Void → Kotlin では Void? として扱われる

5. 実例:Future を Kotlin で扱う

// Java 側
Future<Void> asyncJob = executor.submit(() -> {
    System.out.println("Job done!");
    return null;
});

Kotlin 側ではこう見えます:

val asyncJob: Future<Void> = executor.submit<Void> {
    println("Job done!")
    null  // Void型はnullを返すしかない
}

ここで Void が登場するのは「戻り値を表すための占位型(placeholder)」です。
**意味としては「何も返さないけど型は必要」**という状態。


6. Kotlin の UnitVoid の構造的違い

項目 Unit Void
クラス定義 Kotlin の object Unit Java の final class Void
インスタンス 1つ存在 (Unit) 存在しない(private constructor)
返り値の意味 “空” の値(副作用処理の成功) “返すものがない”ことの占位
Interopでの役割 Kotlin 内部表現 Java互換のための橋渡し

7. 実際に違いを体験してみよう

fun kotlinFunc(): Unit {
    println("This returns Unit")
}

fun javaLikeFunc(): Void? {
    println("This returns Void")
    return null
}

fun main() {
    println(kotlinFunc()) // kotlin.Unit
    println(javaLikeFunc()) // null
}

出力:

This returns Unit
kotlin.Unit
This returns Void
null

Unit は値が存在するが、
Voidnullしか返せないことがわかります。


8. Unit / Nothing / Void の関係まとめ

存在 意味 代表的な使い方
Unit ✅ 1つ存在 「戻り値はないが、正常に終了する」 Kotlin 関数全般
Nothing ❌ なし 「戻らない/例外で終了」 throw, TODO()
Void ❌(nullのみ) 「Java の void の互換型」 Interop (Future<Void>)

図で見る関係

Any
 ├── Unit (値は1つ)
 ├── Int / String / ...
 └── Nothing (値なし)
   ↑
   Void (Java互換。実体はnull)

9. 実務でのポイント

Kotlinコードでは原則 Unit を使う
fun foo(): Unitfun foo() の形式。

Java互換APIを使うときのみ Void が登場する
Callable<Void>Future<Void> の戻り値用。

Void を Kotlin 側で new できない
Void() は不可能。return null 一択。


10. まとめ

項目 内容
型名 Void (java.lang.Void)
由来 Java の void のラッパ型
実際の値なし(nullのみ)
主な用途 Java Interop 用 (Callable<Void>, Future<Void>)
Kotlin の代替 通常は Unit を使用
注意点 Void 型の関数では return null が必須

Unit:Kotlin ネイティブな「空の値」
Nothing:戻らないことを示す「空の型」
Void:Java との互換のための「占位型」

Kotlin コードでは基本 Unit を使い、
VoidJavaとつながるときだけ登場します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?