Alles über Kotlin Generics

Kailash Vaviya 15 Februar 2024
  1. Kotlin Generics
  2. Das Problem, Kotlin Generics nicht zu verwenden
  3. Wie Kotlin Generics das Problem lösen
  4. Übergeben Sie eine Art generischer Methode in Kotlin
Alles über Kotlin Generics

Dieser Artikel stellt das Konzept der Kotlin Generics vor. Kotlin Generics sind leistungsstarke Funktionen, mit denen Klassen und Funktionen definiert werden können, auf die über verschiedene Datentypen zugegriffen werden kann.

Kotlin Generics

Wir müssen die Generika als parametrisierte Typen deklarieren. Diese parametrisierten Typen sind eine Instanz von generischen Typen und werden mit spitzen Klammern <> deklariert.

Die Typunterschiede der generischen Klassen und Methoden werden zur Kompilierzeit überprüft.

Hier ist die Syntax:

Generische Klassen:

class_or_interface<Type>

Allgemeine Methoden:

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

Wir wissen, dass Kotlin Generics leistungsstarke Funktionen sind, aber was macht sie so leistungsstark? Es sind die Vorteile, die sie bieten.

Vorteile von Kotlin Generics

Kotlin Generics bieten die folgenden Hauptvorteile.

  1. Typsicherheit – Generic ermöglicht das Halten nur eines einzigen Objekttyps, wodurch die Wahrscheinlichkeit von Tippfehlern eliminiert wird.
  2. Keine Typumwandlung erforderlich – Generisch verringert die Notwendigkeit der Typumwandlung des Objekts.
  3. Überprüfungen zur Kompilierzeit – Überprüfungen werden zur Kompilierzeit durchgeführt, um Laufzeitfehler zu vermeiden.

Das Problem, Kotlin Generics nicht zu verwenden

Das Problem ist, dass wir ohne die Verwendung von Kotlin Generics keine unterschiedlichen Datentypen für einen Parameter übergeben können. Betrachten wir ein Beispiel, um dies zu sehen.

Wir erstellen eine Student-Klasse mit einem einzigen Parameter. Wir werden dann zwei Datentypen übergeben: Int und String, um zu sehen, was zur Kompilierzeit passiert.

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
}

Ausgabe:

Übergeben verschiedener Datentypen ohne Verwendung von Kotlin Generics

Wie wir in der Ausgabe sehen können, gibt das Programm einen Kompilierzeitfehler aus. Der Code akzeptiert den Int-Typ, wie er initialisiert wird, lehnt aber den String-Typ "19" ab.

Wie Kotlin Generics das Problem lösen

Um das Problem mit mehreren Datentypen zu lösen, können wir eine generische Klasse verwenden. Wir können das Problem lösen, da die generische Klasse mehrere Datentypen für einen einzelnen Parameter akzeptiert.

Hier erstellen wir eine generische Klasse, die sowohl die Typen Int als auch String akzeptiert.

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
}

Ausgabe:

Übergeben verschiedener Datentypen mit Kotlin Generics

Im obigen Beispiel ändert sich der Datentyp der Objekte basierend auf dem Parameter, den wir übergeben.

Übergeben Sie eine Art generischer Methode in Kotlin

Wir haben gesehen, wie Kotlin Generics verwendet werden, um verschiedene Datentypen während der Initialisierung zu übergeben. Was aber, wenn wir eine generische Methode als Parameter übergeben wollen?

Hier ist ein Beispiel, in dem wir eine generische Methode erstellen und sie als Parameter übergeben.

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

Ausgabe:

Übergeben einer generischen Kotlin-Methode als Parameter

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