Java generics are indeed implemented by type erasure, so there is no type information in the bytecode. For example, let's take a look two classes which declare a List field, one in generic and the other in non-generic form: class NonGeneric { List list; } And, class Generic { List<String> list; } In both cases, the resulting bytecode is the following: Code: Stack=3, Locals=1, Args_size=1 0: aload_