What are Generics and what kind of problems do they solve?