Kotlin Academy · Oppitunti

Geneeriset rajoitteet

Rajaa tyyppiparametreja

Oppitunti 4/413 vaihetta

Geneeriset rajoitteet on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Tyyppiparametrien rajoittaminen

Joskus geneerisen tyypin on hyväksyttävä vain tiettyjä tyyppejä, esimerkiksi vertailukelpoisia tyyppejä tai tietyn perusluokan aliluokkia. Geneeriset rajoitteet määrittävät tyyppiparametrille ylärajan.

Oletusarvoinen yläraja

Ilman rajoitetta tyyppiparametrin yläraja on Any?, joten se hyväksyy minkä tahansa tyypin, myös nullable-tyypit. Jos haluat sallia vain ei-null-tyypit, rajoita parametri tyyppiin Any.

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

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

Yksi yläraja

Käytä merkintää T : Bound edellyttääksesi, että T on tyypin Bound alityyppi. Tällöin voit kutsua ylärajan jäseniä funktion sisällä.

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-rajoite

Yleinen rajoite on Comparable<T>, jonka avulla voit verrata alkioita operaattoreilla < ja > tai funktiolla 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"))
}

Ylärajan jäsenten kutsuminen

Rajoitetun geneerisen tyypin sisällä kääntäjä tietää, että T:llä on ylärajan ohjelmointirajapinta, joten voit kutsua sen metodeja suoraan ilman tyyppimuunnosta.

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

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

Useita ylärajoja where-lausekkeella

Jos ylärajoja on enemmän kuin yksi, käytä where-lauseketta. T:n on silloin täytettävä KAIKKI luetellut rajoitteet.

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

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

Luokkien ylärajat

Rajoitteita voi käyttää myös geneeristen luokkien kanssa, jolloin ne rajoittavat sitä, millä tyypeillä luokka voidaan luoda.

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

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

Rajoitteen mahdollistamat operaatiot

Rajoitteen tarkoitus on mahdollistaa operaatioita. Ilman rajoitetta T : Number et voisi kutsua funktiota toDouble(); yläraja takaa, että metodi on olemassa.

Ei-null-rajoite käytännössä

Tyypin Any käyttäminen ylärajana hylkää nullable-argumentit käännösaikana. Se on kätevä tapa edellyttää geneerisiltä tyypeiltä ei-null-arvoja.

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

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

Yhdistäminen varianssiin

Rajoitteet ja varianssi ratkaisevat eri ongelmia: varianssi (in/out) hallitsee alityyppisuhteita, kun taas rajoitteet (:-ylärajat ja where) rajoittavat sallitut tyypit. Niitä voi käyttää yhdessä.

Hyvien rajoitteiden suunnittelu

Lisää rajoite vain, kun tarvitset tyypiltä tietyn ominaisuuden. Liian tiukat rajoitteet heikentävät uudelleenkäytettävyyttä, kun taas liian väljät rajoitteet pakottavat käyttämään tyyppimuunnoksia. Aseta ylärajaksi yleisin tyyppi, joka tarjoaa käyttämäsi operaatiot.

Pikatarkistus

Miten edellytät, että tyyppiparametri täyttää useamman kuin yhden ylärajan?

Kertaus

Geneeriset rajoitteet asettavat ylärajoja merkinnällä T : Bound tai useille ylärajoille where-lausekkeella. Ne mahdollistavat ylärajan operaatiot ja sulkevat pois yhteensopimattomat tyypit. Yläraja Any edellyttää ei-null-arvoa. Yhdessä varianssin kanssa rajoitteiden avulla voit suunnitella turvallisia ja ilmaisuvoimaisia geneerisiä tyyppejä. Tämä päättää Generics and Variance -kurssin.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Geneeriset rajoitteet” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Geneeriset rajoitteet”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Geneeriset rajoitteet”?

Rajaa tyyppiparametreja Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Geneeriset rajoitteet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Geneeriset funktiot ja luokat
  2. Deklaraatiopaikan varianssi
  3. Käyttöpaikan varianssi
  4. Geneeriset rajoitteet
← Takaisin: Kotlin Academy