Kotlin Generics についてのすべて
この記事では、Kotlin ジェネリックの概念を紹介します。Kotlin ジェネリックは、さまざまなデータタイプからアクセスできるクラスと関数を定義できる強力な機能です。
Kotlin Generics
ジェネリックをパラメーター化されたタイプとして宣言する必要があります。これらのパラメーター化されたタイプは汎用タイプのインスタンスであり、山括弧 <>
を使用して宣言されます。
ジェネリッククラスとメソッドのタイプの違いは、コンパイル時にチェックされます。
構文は次のとおりです。
一般的なクラス:
class_or_interface<Type>
一般的な方法:
<Type>methodName(parameter: classType<Type>)
Kotlin ジェネリックが強力な機能であることはわかっていますが、何がそれらを強力にするのでしょうか。それは彼らが提供する利点です。
Kotlin Generics の利点
Kotlin ジェネリックには、次の主な利点があります。
- タイプの安全性-Generic では、単一のタイプのオブジェクトのみを保持できるため、タイプエラーの可能性がなくなります。
- タイプキャストの必要がない-Generic は、オブジェクトのタイプキャストの必要性を軽減します。
- コンパイル時のチェック-実行時エラーを回避するために、コンパイル時にチェックが実行されます。
Kotlin Generics を使用しない場合の問題
問題は、Kotlin ジェネリックを使用しないと、パラメーターに異なるデータタイプを渡すことができないことです。これを確認するための例を考えてみましょう。
単一のパラメーターを使用して Student
クラスを作成します。次に、Int
と String
の 2つのデータタイプを渡して、コンパイル時に何が起こるかを確認します。
class Student (id:Int){
var id: Int = id
init {
this.id = id
println(id)
}
}
fun main(args: Array<String>){
var idInt: Student = Student(17)
var idString: Student = Student("19") // This throws an error
}
出力:
出力からわかるように、プログラムはコンパイル時エラーをスローします。このコードは、初期化時に Int
タイプを受け入れますが、String
タイプ"19"
を拒否します。
Kotlin Generics が問題を解決する方法
複数のデータタイプの問題を克服するために、汎用クラスを使用できます。ジェネリッククラスは単一のパラメーターに対して複数のデータタイプを受け入れるため、この問題を克服できます。
ここでは、Int
タイプと String
タイプの両方を受け入れる汎用クラスを作成します。
class Student<T>(id: T){
var id: T = id
init {
this.id = id
println(id)
}
}
fun main(args: Array<String>){
var idInt: Student<Int> = Student(17)
var idString: Student<String> = Student("19") // This won't throw an error
}
出力:
上記の例では、オブジェクトのデータタイプは、渡したパラメータに基づいて変化します。
Kotlin で一般的なメソッドのタイプを渡す
Kotlin ジェネリックを使用して、初期化中にさまざまなデータタイプを渡す方法を見てきました。しかし、一般的なメソッドをパラメーターとして渡したい場合はどうでしょうか。
これは、汎用メソッドを作成し、それをパラメーターとして渡す例です。
import kotlin.reflect.KClass
data class Person(val city: String)
data class Employee(val city: String)
fun getPerson(): List<Person> = listOf(Person("New York"))
fun getEmployee(): List<Employee> = listOf(Employee("Chicago"))
fun <T: Any> getInfo(xyz: KClass<T>): List<T>? {
return when(xyz) {
Person::class -> getPerson() as List<T>
Employee::class -> getEmployee() as List<T>
else -> null
}
}
fun main(args: Array<String>) {
val v = listOf(Person::class, Employee::class)
v.forEach { type ->
val i = getInfo(type)
println(i)
}
}
出力:
Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.
LinkedIn