Home > Java > javaTutorial > How do Covariance, Invariance, and Contravariance Affect Type Relationships in Programming?

How do Covariance, Invariance, and Contravariance Affect Type Relationships in Programming?

Barbara Streisand
Release: 2024-11-12 03:28:01
Original
318 people have browsed it

How do Covariance, Invariance, and Contravariance Affect Type Relationships in Programming?

Covariance, Invariance, and Contravariance in Plain English: A Comprehensive Explanation

Covariance, invariance, and contravariance are programming concepts that describe how the relationship between types and subtypes is affected by type transformations. These concepts play a crucial role in understanding polymorphism and type safety in programming languages.

Covariance

A covariance indicates that the subtype relation is preserved by the type transformation. In other words, if type A is a subtype of type B, then the transformed type f(A) is also a subtype of f(B). For example, consider the transformation f(A) = List, where List is declared as:

class List<T> { ... }
Copy after login
Copy after login

Since List is a subtype of List, we have f(String) = List is a subtype of f(Object) = List. Therefore, f is covariant.

Contravariance

Contravariance is the opposite of covariance. It indicates that the subtype relation is reversed by the type transformation. If A is a subtype of B, then f(B) is a subtype of f(A). For instance, consider the transformation f(A) = A[]. The transformation reverses the subtype relation between arrays: Object[] is a subtype of String[], but String[] is not a subtype of Object[]. This makes f contravariant.

Invariance

Invariance occurs when neither covariance nor contravariance holds. In other words, the subtype relation is not preserved or reversed by the type transformation. For example, consider the transformation f(A) = Map. If A is a subtype of B, there is no guarantee that f(A) = Map is a subtype of f(B) = Map. Thus, f is invariant.

Applications in Language Features