Introduced by Barbara Liskov
A child class must be able to be used in place of a parent class
- • Return types can return a more specific (narrower) type (covariance)
- • Argument types can accept a more restricted (wider) type (contravariance)
- • Property types can not change (invariance)