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
- Generische Funktionen und Klassen
- Deklarationsseitige Varianz
- Verwendungsseitige Varianz
- Einschränkungen für generische Typen