Since Java 1.5, I've been used to writing List<Class>, allowing the compiler to insure type safety of collections.
There's one issue with this, however.
let's say you have an interface. We'll call it TheInterface.
Java is more than content with allowing you to say List<TheInterface>
The problem with that syntax is that it says that the contents of the List will always be items whose exact type is TheInterface.
But it's an interface. So there will never be any of those.
The solution is simple: you're supposed to say List<? extends TheInterface>. This lets the list contain any objects that implement the given interface, which is almost assuredly exactly what you want.
So why isn't List<TheInterface> a compile error?