Generics in Java allow for parametric polymorphism. They implement type erasure during compilation, discarding type information and replacing types with bounds like Object. This leads to issues but allows pre-Java 5 code to still work. Wildcard types like List<?> match unknown types and prevent adding non-null values. Bounded wildcards like <? extends T> and <? super T> are used for producer/consumer relationships. Generic methods also allow type parameters.