Start here. This is the direct spoken answer to practice first.
Overview
The practical goal is to know which guarantees the compiler enforces and which distinctions a runtime object cannot make.
Java implements most generic type checking at compile time, then erases type parameters to their bound or to Object in executable code and inserts casts where needed. A List<String> object therefore does not carry a runtime element-type tag that distinguishes it from a List<Integer> object. This is why code cannot test value instanceof List<String>. The compiler still records generic declarations and signatures as metadata where the class format supports them, so saying all generic information disappears is too broad.