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