0Pricing
Kotlin Academy · Lektion

Einschränkungen für generische Typen

Begrenzen Sie Typparameter

Einschränkungen für generische Typen ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Typ-Parameter einschränken

Manchmal darf ein generischer Typ nur bestimmte Typen akzeptieren, zum Beispiel vergleichbare Typen oder Typen, die von einer Basisklasse erben. Generische Einschränkungen legen eine obere Schranke für einen Typ-Parameter fest.

Die standardmäßige obere Schranke

Ohne Einschränkung ist die obere Schranke eines Typ-Parameters Any?. Dadurch werden alle Typen akzeptiert, auch nullable Typen. Wenn Sie nur nicht-nullbare Typen zulassen möchten, begrenzen Sie den Typ auf Any.

fun <T : Any> requireNonNull(value: T): T {
    return value
}

fun main() {
    println(requireNonNull(42))
}

Eine einzelne obere Schranke

Verwenden Sie T : Bound, um zu verlangen, dass T ein Subtyp von Bound ist. Dadurch können Sie innerhalb der Funktion auf die Member der Schranke zugreifen.

fun <T : Number> sumDoubled(a: T, b: T): Double {
    return a.toDouble() * 2 + b.toDouble() * 2
}

fun main() {
    println(sumDoubled(3, 4))
    println(sumDoubled(1.5, 2.5))
}

Comparable-Schranke

Eine häufig verwendete Schranke ist Comparable<T>. Sie ermöglicht es Ihnen, Elemente mit <, > oder compareTo zu vergleichen.

fun <T : Comparable<T>> maxOf2(a: T, b: T): T {
    return if (a > b) a else b
}

fun main() {
    println(maxOf2(3, 9))
    println(maxOf2("apple", "banana"))
}

Member der Schranke aufrufen

Innerhalb eines eingeschränkten generischen Typs weiß der Compiler, dass T die API der Schranke besitzt. Daher können Sie diese Methoden direkt und ohne Cast aufrufen.

fun <T : CharSequence> describe(value: T): String {
    return "Length is ${value.length}"
}

fun main() {
    println(describe("hello"))
    println(describe(StringBuilder("hi")))
}

Mehrere Schranken mit where

Für mehr als eine Schranke verwenden Sie die where-Klausel. T muss dann ALLE aufgeführten Einschränkungen erfüllen.

fun <T> copyWhenValid(value: T): T
    where T : CharSequence, T : Comparable<T> {
    return value
}

fun main() {
    println(copyWhenValid("text"))
}

Schranken für Klassen

Einschränkungen funktionieren auch bei generischen Klassen. Sie legen fest, mit welchen Typen die Klasse instanziiert werden kann.

class NumberBox<T : Number>(val value: T) {
    fun asDouble(): Double = value.toDouble()
}

fun main() {
    val box = NumberBox(10)
    println(box.asDouble())
}

Einschränkungen ermöglichen Operationen

Der eigentliche Zweck einer Einschränkung besteht darin, Operationen zu ermöglichen. Ohne T : Number könnten Sie toDouble() nicht aufrufen. Die Schranke garantiert, dass die Methode vorhanden ist.

Eine Nicht-null-Schranke in der Praxis

Eine Begrenzung auf Any weist nullable Argumente bereits zur Compile-Zeit zurück. Das ist eine praktische Möglichkeit, nicht-nullbare generische Typen zu verlangen.

fun <T : Any> firstNonNull(a: T, b: T): T = a

fun main() {
    println(firstNonNull("x", "y"))
    // firstNonNull(null, "y") would not compile
}

Mit Varianz kombinieren

Einschränkungen und Varianz lösen unterschiedliche Probleme: Die Varianz (in/out) steuert Subtyping-Beziehungen, während Einschränkungen (Schranken mit : und where) festlegen, welche Typen zulässig sind. Sie können beides miteinander kombinieren.

Gute Einschränkungen entwerfen

Fügen Sie eine Einschränkung nur hinzu, wenn Sie eine bestimmte Fähigkeit des Typs benötigen. Zu viele Einschränkungen verringern die Wiederverwendbarkeit, zu wenige erzwingen Casts. Verwenden Sie als Schranke den allgemeinsten Typ, der die von Ihnen benötigten Operationen bereitstellt.

Kurze Überprüfung

Wie verlangen Sie, dass ein Typ-Parameter mehr als eine Schranke erfüllt?

Zusammenfassung

Generische Einschränkungen legen mit T : Bound obere Schranken fest. Für mehrere Schranken verwenden Sie where. Dadurch werden die Operationen der Schranke verfügbar und inkompatible Typen ausgeschlossen. Die Begrenzung auf Any verlangt einen nicht-nullbaren Typ. In Kombination mit Varianz ermöglichen Einschränkungen den Entwurf sicherer und ausdrucksstarker generischer Typen. Damit ist der Kurs „Generics und Varianz“ abgeschlossen.

Häufig gestellte Fragen

Ist die Lektion „Einschränkungen für generische Typen“ kostenlos?

Ja — der vollständige Text von „Einschränkungen für generische Typen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Einschränkungen für generische Typen“?

Begrenzen Sie Typparameter Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Einschränkungen für generische Typen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Generische Funktionen und Klassen
  2. Deklarationsseitige Varianz
  3. Verwendungsseitige Varianz
  4. Einschränkungen für generische Typen
← Zurück zu Kotlin Academy