1. 序章

このチュートリアルでは、Kotlinでの Void タイプと、Kotlinでボイドまたはゼロを表す他の基本的な方法について学習します。

2. Voidvoid – Java

KotlinでのVoidの使用法を理解するために、まずJavaでの Void タイプとは何か、およびJavaプリミティブキーワードvoidとの違いを確認しましょう。

Voidクラスは、java.langパッケージの一部として、Javaプリミティブ型voidをラップするオブジェクトへの参照として機能します。 これは、次のような他のラッパークラスに類似していると見なすことができます。 整数 —プリミティブ型のラッパー int

現在、 Void は、プリミティブ void の代わりに返す必要があるユースケースがあまりないため、他の一般的なラッパークラスには含まれていません。 ただし、プリミティブを使用できないジェネリックスなどのアプリケーションでは、代わりにVoidクラスを使用します。

3. KotlinのVoid

KotlinはJavaと完全に相互運用できるように設計されているため、JavaコードをKotlinファイルで使用できます

Kotlin関数の戻り型としてJavaのVoid型を使用してみましょう。

fun returnTypeAsVoidAttempt1() : Void {
    println("Trying with Void return type")
}

しかし、この関数はコンパイルされず、以下のエラーが発生します。

Error: Kotlin: A 'return' expression required in a function with a block body ('{...}')

このエラーは理にかなっており、同様の関数を使用すると、Javaでも同様のエラーが発生します。

これを修正するために、returnステートメントを追加してみます。 ただし、 Voidはインスタンス化できないJavaの最終クラスであるため、このような関数からのみnullを返すことができます。

fun returnTypeAsVoidAttempt2(): Void {
    println("Trying with Void as return type")
    return null
}

このソリューションも機能せず、次のエラーで失敗します。

Error: Kotlin: Null can not be a value of a non-null type Void

上記のメッセージの理由は、Javaとは異なり、Kotlinのnull以外の戻り型からnullを返すことができないためです。

Kotlinでは、?を使用して関数の戻り型をnull許容にする必要があります。 オペレーター

fun returnTypeAsVoidSuccess(): Void? {
    println("Function can have Void as return type")
    return null
}

最終的に機能するソリューションができましたが、次に説明するように、同じ結果を達成するためのより良い方法があります。

4. Kotlinのユニット

KotlinのUnitは、意味のあるものを返さない関数の戻りタイプとして使用できます。

fun unitReturnTypeForNonMeaningfulReturns(): Unit {
    println("No meaningful return")
}

デフォルトでは、Java voidはKotlinのUnitタイプにマップされます。 これは、Kotlinから呼び出されたときにJavaでvoidを返すメソッドは、 Unit — 、たとえば System.out.println()functionを返すことを意味します。 。

@Test
fun givenJavaVoidFunction_thenMappedToKotlinUnit() {
    assertTrue(System.out.println() is Unit)
}

また、 Unitはデフォルトの戻りタイプであり、オプションであると宣言しているため、以下の関数も有効です。

fun unitReturnTypeIsImplicit() {
    println("Unit Return type is implicit")
}

5. Kotlinでは何も

Nothing は、存在しない値を表すために使用されるKotlinの特殊なタイプです。関数の戻り型がNothingの場合、その関数はデフォルトの戻り型Unitでさえも値を返しません。 。

たとえば、以下の関数は常に例外をスローします。

fun alwaysThrowException(): Nothing {
    throw IllegalArgumentException()
}

理解できるように、Nothing戻り型の概念はまったく異なり、Javaには同等のものがありません。後者の場合、関数は常にデフォルトでvoid戻り型になります。上記の例のように、その関数が何も返さない場合があります。

KotlinのNothingリターンタイプは、潜在的なバグや不当なコードから私たちを救います。リターンタイプとして Nothing を持つ関数が呼び出されると、コンパイラはこの関数呼び出しを超えて実行されません。適切な警告を表示します。

fun invokeANothingOnlyFunction() {
    alwaysThrowException() // Function that never returns
    var name="Tom" // Compiler warns that this is unreachable code
}

6. 結論

このチュートリアルでは、JavaでのvoidVoid、およびKotlinでのそれらの使用方法について学習しました。 また、UnitおよびNothingタイプと、さまざまなシナリオのリターンタイプとしてのそれらの適用性についても学びました。

いつものように、このチュートリアルで使用されるすべてのコードは、GitHubから入手できます。