KotlinのVoidタイプ
1. 序章
このチュートリアルでは、Kotlinでの Void タイプと、Kotlinでボイドまたはゼロを表す他の基本的な方法について学習します。
2. Voidとvoid – Java
KotlinでのVoidの使用法を理解するために、まずJavaでの Void タイプとは何か、およびJavaプリミティブキーワードvoidとの違いを確認しましょう。
現在、 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を返すことができないためです。
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でのvoidとVoid、およびKotlinでのそれらの使用方法について学習しました。 また、UnitおよびNothingタイプと、さまざまなシナリオのリターンタイプとしてのそれらの適用性についても学びました。
いつものように、このチュートリアルで使用されるすべてのコードは、GitHubでから入手できます。