Type erasure applies to the use of generics. There’s definitely metadata in the class file to say whether or not a method/type is generic, and what the constraints are etc. But when generics are used, they’re converted into compile-time checks and execution-time casts. So this code:
List<String> list = new ArrayList<String>();
list.add("Hi");
String x = list.get(0);
is compiled into
List list = new ArrayList();
list.add("Hi");
String x = (String) list.get(0);
At execution time there’s no way of finding out that T=String
for the list object – that information is gone.
… but the List<T>
interface itself still advertises itself as being generic.
EDIT: Just to clarify, the compiler does retain the information about the variable being a List<String>
– but you still can’t find out that T=String
for the list object itself.