Java Generics Explained - Everything You Ever Wanted to Know About Java Generics But Were Afraid to Ask