Kotlin Generics についてのすべて

Kailash Vaviya 2024年2月15日
  1. Kotlin Generics
  2. Kotlin Generics を使用しない場合の問題
  3. Kotlin Generics が問題を解決する方法
  4. Kotlin で一般的なメソッドのタイプを渡す
Kotlin Generics についてのすべて

この記事では、Kotlin ジェネリックの概念を紹介します。Kotlin ジェネリックは、さまざまなデータタイプからアクセスできるクラスと関数を定義できる強力な機能です。

Kotlin Generics

ジェネリックをパラメーター化されたタイプとして宣言する必要があります。これらのパラメーター化されたタイプは汎用タイプのインスタンスであり、山括弧 <> を使用して宣言されます。

ジェネリッククラスとメソッドのタイプの違いは、コンパイル時にチェックされます。

構文は次のとおりです。

一般的なクラス:

class_or_interface<Type>

一般的な方法:

<Type>methodName(parameter: classType<Type>)

Kotlin ジェネリックが強力な機能であることはわかっていますが、何がそれらを強力にするのでしょうか。それは彼らが提供する利点です。

Kotlin Generics の利点

Kotlin ジェネリックには、次の主な利点があります。

  1. タイプの安全性-Generic では、単一のタイプのオブジェクトのみを保持できるため、タイプエラーの可能性がなくなります。
  2. タイプキャストの必要がない-Generic は、オブジェクトのタイプキャストの必要性を軽減します。
  3. コンパイル時のチェック-実行時エラーを回避するために、コンパイル時にチェックが実行されます。

Kotlin Generics を使用しない場合の問題

問題は、Kotlin ジェネリックを使用しないと、パラメーターに異なるデータタイプを渡すことができないことです。これを確認するための例を考えてみましょう。

単一のパラメーターを使用して Student クラスを作成します。次に、IntString の 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
}

出力:

Kotlin ジェネリックを使用せずにさまざまなデータタイプを渡す

出力からわかるように、プログラムはコンパイル時エラーをスローします。このコードは、初期化時に 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 で一般的なメソッドのタイプを渡す

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)
    }
}

出力:

Kotlin 汎用メソッドをパラメーターとして渡す

著者: Kailash Vaviya
Kailash Vaviya avatar Kailash Vaviya avatar

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