Kotlinのボイドタイプ

1. 前書き

このチュートリアルでは、Kotlinの_Void_型と、Kotlinでvoidまたは何も表現しない他の方法について学びます。

2. Void vs void – Javaの

Kotlinでの_Void_の使用を理解するために、最初にJavaの_Void_型とは何か、およびJavaプリミティブキーワード_void_ *との違いを確認しましょう。
  • java.lang_パッケージの一部としてのVoid __classは、Javaプリミティブ型_voidをラップするオブジェクトへの参照として機能します。 _ **プリミティブ型_int_のラッパーである_Integer_などの他のラッパークラスに類似していると見なすことができます。

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

3. Kotlinの_Void_

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

    Javaの_Void_型をKotlin関数の戻り値の型として使用してみましょう。
fun returnTypeAsVoidAttempt1() : Void {
    println("Trying with Void return type")
}
ただし、この関数はコンパイルされず、以下のエラーが発生します。
Error: Kotlin: A 'return' expression required in a function with a block body ('{...}')
このエラーは理にかなっており、同様の関数はJavaでも同様のエラーを与えていました。
これを修正するために、returnステートメントを追加してみます。 しかし、* sin __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の_Unit_

  • Kotlinの_Unit_は、意味のあるものを返さない関数の戻り型として使用できます。*

fun unitReturnTypeForNonMeaningfulReturns(): Unit {
    println("No meaningful return")
}
デフォルトでは、Java _void_はKotlinの__Unit __typeにマップされます。 *これは、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. コトリンの_Nothing_

__Nothing __は、Kotlinの特別な型であり、存在しない値を表すために使用されます。 *関数の戻り値の型が__Nothing __である場合、その関数はデフォルトの戻り値の型_Unit_でさえ値を返しません。*
たとえば、次の関数は常に例外をスローします。
fun alwaysThrowException(): Nothing {
    throw IllegalArgumentException()
}
*理解できるように、__the Nothing ___return型の概念はまったく異なり、Javaには同等のものはありません。*後者では、上記の例のような場合があったとしても、関数は常に_void_戻り型になります。関数は何も返さないことがあります。
  • Kotlinの_Nothing_戻り値型は、潜在的なバグや保証されていないコードから私たちを救います。

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

6. 結論

このチュートリアルでは、Javaでの_void_と_Void_について、およびそれらをKotlinで使用する方法を学びました。 また、_Unit_および_Nothing_型と、さまざまなシナリオの戻り値型としての適用性についても学びました。
いつものように、このチュートリアルで使用されるすべてのコードはhttps://github.com/eugenp/tutorials/tree/master/core-kotlin-2[Github上]で入手できます。