Type erasure
Generics implementation where type parameters are removed at compile time. Java 5 (2004) chose this route for backward compat with pre-generics bytecode. Consequence: List<String> and List<Integer> are the same type at runtime.
Practical consequences: can't new T() in Java generics, can't type-check via instanceof List<String>. Kotlin: inline fun <reified T> bypasses erasure for specific cases. TypeScript: erasure (types are stripped when compiling to JS) — nothing left at runtime. Distinct from monomorphization (Rust, C++): generates separate code per type → more optimization, bigger binary. Scala 3 + Kotlin try to mitigate erasure via runtime type info via specific strategies.