In this post we look at Variance in Generics and how it is handled in Java and Scala. We consider use-site and declaration-site approaches and the trade offs of erasure. Finally we take a look at Phantom and Existential types and how they can enhance the capabilities of the type system when it comes to modelling.