Covarianza, controvarianza e invarianza descrivono il modo in cui la gerarchia di ereditarietà del tipo esistente cambia quando è soggetta a qualche trasformazione (come l'utilizzo all'interno dei generici). Se la trasformazione mantiene l'ordine della gerarchia originale, è "covariante". Se lo inverte, è "controvariante". Se lo rompe, è "invariante".