background
Why does JDK5 introduce generics, generics ensure parameter type consistency. What is type consistency?
Assuming an inheritance relationship, A <- B <- C <- D <- E,
ArrayList<C> list;
list.add(new C());
list.add(new D());
list.add(new B());//compile ERROR
It does not destroy the type consistency of the list, because when the parameter type of the list is declared as C, all the reference objects in the list are finally taken out according to the type of C.
With the generic feature, Java should use parameterized types instead of rawtypes. But for compatibility, the use of rawtype is still supported.
Generics have some weird-looking properties that make sense under the assumption that you can't use rawtypes and only use generics.