Varianssi tietotekniikassa (engl. type variance, variance in generics) kuvaa geneeristen tyyppien tai rajapintojen tyyppiparametrien käyttäytymistä alityyppisuhteissa. Varianssi jaetaan kolmeen muotoon: kovarianssiin (covariance), kontravarianssiin (contravariance) ja invarianssiin (invariance). Käsite mahdollistaa joustavamman tyyppiturvallisuuden esimerkiksi kokoelmissa, rajapinnoissa ja funktioissa.
Käsite otettiin laajempaan käyttöön C# 4.0 -versiossa vuonna 2010 ja Javassa wildcardien avulla jo aiemmin.
Kovarianssi Kovarianssissa tyyppiparametri voi esiintyä vain palautusarvoissa (output-positioissa). Tällöin geneerinen tyyppi säilyttää alityyppisuhteen: alityypin ilmentymä on korvattavissa ylityypin ilmentymällä.
Esimerkki C#:ssä: rajapinta IEnumerable<out T> mahdollistaa muunnoksen IEnumerable<Koira> → IEnumerable<Eläin>, koska kokoelma vain palauttaa arvoja.
Kontravarianssi Kontravarianssissa tyyppiparametri voi esiintyä vain syöteparametreissa (input-positioissa). Tällöin alityyppisuhde kääntyy vastakkaiseksi: ylityypin ilmentymä on korvattavissa alityypin ilmentymällä.
Esimerkki C#:ssä: rajapinta IComparer<in T> mahdollistaa muunnoksen IComparer<Eläin> → IComparer<Koira>, koska vertailija vain vastaanottaa arvoja.
Invarianssi Invarianssissa tyyppiparametri ei ole kovariantti eikä kontravariantti. Tämä on oletusarvo useimmissa geneerisissä luokissa ja estää sekä luku- että kirjoitusturvaongelmat tyyppiparametrin kautta. Esimerkiksi List<T> on invariantti C#:ssä ja Javassa.
Toteutuksia ohjelmointikielissä C#: Tuki lisättiin versiossa 4.0 (2010) avainsanoilla out (kovarianssi) ja in (kontravarianssi) geneerisissä rajapinnoissa ja delegaateissa. Java: Varianssia toteutetaan wildcardeilla (? extends kovarianssiin, ? super kontravarianssiin). Scala: declaration-site-varianssi merkinnöillä +T (kovariantti) ja -T (kontravariantti).
Lähteet
Luokka:Tietotekniikka Luokka:Ohjelmointi