はじめに
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 の Unit と Void の構造的違い
| 項目 | 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 は値が存在するが、
Void は nullしか返せないことがわかります。
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(): Unit や fun 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 を使い、
Void は Javaとつながるときだけ登場します。