Ograniczenia typów generycznych
Ograniczaj parametry typów
Ograniczenia typów generycznych to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Ograniczanie parametrów typów
Czasami typ generyczny powinien akceptować tylko określone typy, na przykład typy porównywalne albo dziedziczące po klasie bazowej. Ograniczenia generyczne ustalają ograniczenie górne dla parametru typu.
Domyślne ograniczenie górne
Jeśli nie określono ograniczenia, ograniczeniem górnym parametru typu jest Any?, więc akceptuje on każdy typ, także typy dopuszczające wartość null. Aby zezwolić tylko na typy niedopuszczające wartości null, należy ograniczyć go do Any.
fun <T : Any> requireNonNull(value: T): T {
return value
}
fun main() {
println(requireNonNull(42))
}Pojedyncze ograniczenie górne
Za pomocą T : Bound można wymagać, aby T było podtypem Bound. Dzięki temu wewnątrz funkcji można wywoływać elementy ograniczenia.
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))
}Ograniczenie Comparable
Typowym ograniczeniem jest Comparable<T>, które pozwala porównywać elementy za pomocą <, > lub compareTo.
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"))
}Wywoływanie elementów ograniczenia
Wewnątrz ograniczonego typu generycznego kompilator wie, że T udostępnia API ograniczenia, dlatego można bezpośrednio wywoływać jego metody bez rzutowania.
fun <T : CharSequence> describe(value: T): String {
return "Length is ${value.length}"
}
fun main() {
println(describe("hello"))
println(describe(StringBuilder("hi")))
}Wiele ograniczeń za pomocą where
Aby określić więcej niż jedno ograniczenie, należy użyć klauzuli where. T musi wtedy spełniać WSZYSTKIE wymienione ograniczenia.
fun <T> copyWhenValid(value: T): T
where T : CharSequence, T : Comparable<T> {
return value
}
fun main() {
println(copyWhenValid("text"))
}Ograniczenia klas
Ograniczenia działają również w przypadku klas generycznych, określając, z jakimi typami można utworzyć instancję klasy.
class NumberBox<T : Number>(val value: T) {
fun asDouble(): Double = value.toDouble()
}
fun main() {
val box = NumberBox(10)
println(box.asDouble())
}Ograniczenie umożliwia operacje
Głównym celem ograniczenia jest udostępnienie określonych operacji. Bez T : Number nie można byłoby wywołać toDouble(); ograniczenie gwarantuje, że ta metoda istnieje.
Ograniczenie niedopuszczające null w praktyce
Ograniczenie do Any odrzuca argumenty dopuszczające wartość null już podczas kompilacji, co jest wygodnym sposobem wymagania generyków niedopuszczających wartości null.
fun <T : Any> firstNonNull(a: T, b: T): T = a
fun main() {
println(firstNonNull("x", "y"))
// firstNonNull(null, "y") would not compile
}Połączenie z wariancją
Ograniczenia i wariancja rozwiązują różne problemy: wariancja (in/out) kontroluje relacje podtypów, natomiast ograniczenia (ograniczenia : i where) określają, które typy są dozwolone. Można ich używać razem.
Projektowanie dobrych ograniczeń
Ograniczenie należy dodawać tylko wtedy, gdy potrzebna jest konkretna możliwość typu. Nadmierne ograniczanie zmniejsza możliwość ponownego użycia, a zbyt małe ograniczenia wymuszają rzutowania. Typ należy ograniczać do najbardziej ogólnego typu udostępniającego używane operacje.
Szybkie sprawdzenie
Jak wymagać, aby parametr typu spełniał więcej niż jedno ograniczenie?
Podsumowanie
Ograniczenia generyczne ustalają ograniczenia górne za pomocą T : Bound lub where w przypadku wielu ograniczeń, udostępniając operacje ograniczenia i wykluczając niezgodne typy. Ograniczenie do Any wymaga wartości niedopuszczającej null. W połączeniu z wariancją ograniczenia pozwalają projektować bezpieczne i wyraziste typy generyczne. Na tym kończy się kurs dotyczący generyków i wariancji.
Ucz się Kotlin dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 51
- Lekcje
- 203
Często zadawane pytania
Czy lekcja „Ograniczenia typów generycznych” jest bezpłatna?
Tak — pełny tekst „Ograniczenia typów generycznych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Ograniczenia typów generycznych”?
Ograniczaj parametry typów Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Ograniczenia typów generycznych”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Funkcje i klasy generyczne
- Wariancja w miejscu deklaracji
- Wariancja w miejscu użycia
- Ograniczenia typów generycznych