I heard the terms “covariance” and “contravariance” used in math long before I heard them used in object oriented programming. I was curious whether there was any connection between the two. To my surprise, they’re very similar. In fact, you could formalize the OOP use of the terms so that they’re not just analogous but actually special cases of the mathematical terms.
When I started writing this post, I intended to explain covariance and contravariance. However, the post became longer and more technical than I like to write here. Instead, I’ll just announce that a connection exists and give references for those who want to read further.
Chris Burrows describes covariance and contravariance in object oriented programming in his article New C# Features in the .NET Framework 4.
The terms covariant and contravariant were defined in category theory before computer scientists applied the terms to object oriented programming. Wikipedia has a short, readable introduction to category theory, including covariant and contravariant functors. See also A Categorical Manifesto (PostScript file).
Computer scientists have been interested in category theory for some time, so it’s not too surprising that category theory terms would filter down into practical programming. The real surprise was hearing category terminology used outside of math. It was like the feeling you get when you run into a coworker at a family reunion or a neighbor at a restaurant in another city.
Update (3 Jan 2011): See also Liskov Substitution Principle is Contravariance
Update (28 Feb 2013): See also how covariance and contravariance are used in the opposite sense with vector fields.